💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
>最近写了个Android开源库「[BaseRecyclerViewAdapterHelper](http://blog.csdn.net/cym492224103/article/details/51171802)」集成了很多常见需求的解决方案,希望大家多多star哦~! #效果如何? ![多个布局item](http://upload-images.jianshu.io/upload_images/972352-6daf57c7a1449c46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![头部+尾部](http://upload-images.jianshu.io/upload_images/972352-1a81cb5f8875733b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #如何使用? ##多个不同布局 ``` public class MultipleItemAdapter extends BaseQuickAdapter<String> { private final int TEXT_TYPE = 1; private int mTextLayoutResId; public MultipleItemAdapter(Context context, List data, int... layoutResId) { super(context, layoutResId[0], data); mTextLayoutResId = layoutResId[1]; } @Override protected int getDefItemViewType(int position) { if (position % 2 == 0) return TEXT_TYPE; return super.getDefItemViewType(position); } @Override protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) { if (viewType == TEXT_TYPE) return new TextViewHolder(getItemView(mTextLayoutResId, parent)); return super.onCreateDefViewHolder(parent, viewType); } @Override protected void onBindDefViewHolder(BaseViewHolder holder, String item) { if (holder instanceof TextViewHolder) holder.setText(R.id.tv, item); } @Override protected void convert(BaseViewHolder helper, String item) { helper.setImageUrl(R.id.iv, item); } public class TextViewHolder extends BaseViewHolder { public TextViewHolder(View itemView) { super(itemView.getContext(), itemView); } } } ``` ##添加头部尾部 ``` mQuickAdapter.addHeaderView(getView()); mQuickAdapter.addFooterView(getView()); ``` #原理分析 >如果需要定义多个不同类型的布局,需要知道以下几点: - 重写getItemViewType()方法,根据需求规则给出不同的type值。 - 在onCreateViewHolder()方法里面根据不同的type来创建不同的ViewHolder - 在onBindViewHolder()里面根据不同holder的类型来赋予相对于的数据 - 如果有额外布局(如:头部尾部)需要修改getItemCount()方法的返回数量 ##多个不同的布局的实现(三部曲) 1.重写了```getDefItemViewType()```方法,其实也就是父类的```getItemViewType()```里面的方法,如上所说,根据页面需求,做出规则,因为上面的UI是一个TextView一个ImageView交替的来,所以就写了个这样规则的 ```if (position % 2 == 0)```保证他们交替着显示。 2.type搞定了,接下来就是调用```onCreateDefViewHolder()```了,根据上面的type来创建不同的ViewHolder, 3.然后再接下来调用```onBindDefViewHolder()```,根据上面创建的ViewHolder的类型不同来进行相应的赋值。 ##添加头部和尾部(额外布局) 在上面的基础之上再重写```getItemCount()```在原本数据量上加上根据额外布局的数量,代码如下 ``` @Override public int getItemCount() { int i = mNextLoadEnable ? 1 : 0; return mData.size() + i + getHeaderViewsCount() + getFooterViewsCount(); } ``` 注意:**如果是添加头部** 那就必须在原```onBindViewHolder()```里面position-头部数量,因为不减去的话,那么数据就会从第二条开始遍历,所以要注意! ``` int index = position - getHeaderViewsCount(); convert(baseViewHolder, mData.get(index)); ``` ##意外收获 ![国际友人的加盟](http://upload-images.jianshu.io/upload_images/972352-592f7882f1a2e736.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **国际友人的加盟!** >每次收获一点点,后续还会扩展更多功能,供大家使用及学习「[BaseRecyclerViewAdapterHelper](http://blog.csdn.net/cym492224103/article/details/51171802)」。