随着公司业务越来越复杂,在同一个列表中需要展示各种类型的数据。
总体结构
ItemViewAdapter: 每种类型的卡片分别都是不同的ItemViewAdapter
ItemViewAdapterFactory: 使用ItemViewAdapterFactory根据不同数据对应不同的ItemViewAdapter
MultiRecyclerViewAdapter: MultiRecyclerViewAdapter就是RecylerView.Adapter,并是个ItemViewAdapterFactory。
具体只要继承MultiRecyclerViewAdapter即可,实现ItemViewAdapterFactory中getViewType、onCreateItemViewAdapter两个方法
ContextMap: 整个Adapter共用一个ContextMap数据上下文,用于外部(例Fragment等)与ItemAdapter交互、ItemAdapter之间交互等一系列数据传递,可以解决参数层层传递的问题
RecyclerViewHolder: 通用RecyclerView.ViewHolder,封装根据id获取view方法getView(viewId)、获取数据上下文方法getContextMap()
使用方法
每种类型卡片Item都实现ItemViewAdapter
package com.lkh.multiadapter; import android.support.annotation.LayoutRes; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * 列表单项布局与数据绑定 * Created by luokanghui on 2017/5/24. */ public abstract class ItemViewAdapter<E>{ /** * 返回列表单项View,如果View由资源layout加载而来,直接重写{@link #onGetLayoutId()}即可 * @param parent 父view,一般为RecyclerView * @return 列表单项View */ public View onCreateView(ViewGroup parent){ return LayoutInflater.from(parent.getContext()).inflate(onGetLayoutId() , parent, false); } /** * 当RecyclerViewHolder创建成功后调用,只会调用一次 * @param viewHolder 单项view集合 */ public void onCreate(RecyclerViewHolder viewHolder){ } /** * 返回单项布局的资源id,如果重写了{@link #onCreateView(ViewGroup)},则此方法可能失效 * @return 单项布局layout id */ @LayoutRes protected abstract int onGetLayoutId(); /** * 把数据与view进行绑定,滑动时都会调用 * @param viewHolder 单项view集合 * @param data 具体数据 * @param position 在列表中的位置 */ public abstract void bindData(RecyclerViewHolder viewHolder, E data, int position); /** * 局部更新时调用 * @param viewHolder 单项view集合 * @param data 具体数据 * @param position 在列表中的位置 * @param payloads 局部更新标志,不会为空(isEmpty()==false) */ public void bindData(RecyclerViewHolder viewHolder, E data, int position, List<Object> payloads){ } }
卡片1:
package com.lkh.multiadapter.sample; import android.widget.TextView; import com.lkh.multiadapter.ItemViewAdapter; import com.lkh.multiadapter.R; import com.lkh.multiadapter.RecyclerViewHolder; /** * 卡片1实现 * Created by luokanghui on 2019/3/18 */ public class SampleOneItemViewAdapter extends ItemViewAdapter<DataOne> { @Override protected int onGetLayoutId() { //布局layout资源id return R.layout.item_one; } @Override public void bindData(RecyclerViewHolder viewHolder, DataOne data, int position) { //根据id获取view TextView tvContent = viewHolder.getView(R.id.tv_content); //数据绑定 tvContent.setText(data.getContent()); } }
package com.lkh.multiadapter.sample; /** * 卡片1数据 * Created by luokanghui on 2019/3/18 */ public class DataOne { private String content; public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
item_one.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#eeeeee" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="卡片1" android:textColor="#000000" /> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="50dp" android:gravity="center" android:textColor="#000000" /> </LinearLayout>
卡片2
package com.lkh.multiadapter.sample; import android.widget.TextView; import com.lkh.multiadapter.ItemViewAdapter; import com.lkh.multiadapter.R; import com.lkh.multiadapter.RecyclerViewHolder; /** * 卡片2实现 * Created by luokanghui on 2019/3/18 */ public class SampleTwoItemViewAdapter extends ItemViewAdapter<DataTwo> { @Override protected int onGetLayoutId() { //布局layout资源id return R.layout.item_two; } @Override public void bindData(RecyclerViewHolder viewHolder, DataTwo data, int position) { //根据id获取view TextView tvNum = viewHolder.getView(R.id.tv_num); //数据绑定 tvNum.setText("num="+data.getNum()); } }
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。