RecyclerView 在Android开发中可以说是使用频率非常高的组件了,本着不造重复轮子的原则,今天我们来打造一个通用且能快速使用的Adapter。
首先我们看看以前的写法:
public class DemoAdapter extends RecyclerView.Adapter { @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { switch (viewType){ case 1:return new ViewHolder1(); case 2:return new ViewHolder2(); ...... } return null; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { //Todo ...... } @Override public int getItemCount() { return list.size(); } }复制代码
从上面的伪代码可以看出,Adapter需要重写onCreateViewHolder和onBindViewHolder两个方法
- onCreateViewHolder负责创建ViewHolder
- onBindViewHolder负责刷新ViewHolder数据
想要打造一个通用的Adapter,就要在Adapter里处理好上面两个方法
如何创建ViewHolder
1.首先我们要创建一个ViewHolder基类
public abstract class FastViewHolderextends RecyclerView.ViewHolder{ public FastViewHolder(View itemView) { super(itemView); } protected void onCreate(){ } public T findViewById(int id) { return itemView.findViewById(id); } public abstract void refreshItem(T bean);}复制代码
我们在基类里声明了创建和刷新两个方法,分别对应Adapter的onCreateViewHolder和onBindViewHolder方法,这样我们只需要处理ViewHolder里的方法即可,无需再理会Adapter的逻辑
2.把ViewHolder实现类添加到FastAdapter
FastAdapter fastAdapter = new FastAdapter(context); fastAdapter.addItem(TextViewHolder.class);复制代码
3.利用反射创建ViewHolder实现类
FastViewHolder fastViewHolder = fastBaseViewHolderClass.getConstructor(View.class).newInstance(itemView); fastViewHolder.onCreate();复制代码
4.itemView的创建
ViewHolder的构造方法需要itemView,我们可以在ViewHolder里添加一个注解,类似下面这样:@RecyclerItemLayoutId(R.layout.item_text)public class TextViewHolder extends FastViewHolder{}复制代码
如何刷新数据
Adapter刷新时需要通知ViewHolder实现类的方法,那如何实现?
因为ViewHolder实现类是继承FastViewHolder的,所以我们只需像下面这样即可:@Override public void onBindViewHolder(FastViewHolder holder, int position) { holder.refreshItem(mDatas.get(position).getData()); }复制代码
然后ViewHolder的实现类就能接收到refreshItem方法,做相应的业务代码即可。
Demo
,欢迎大家给小星星