RecyclerView的使用,打造一个通用的Adapter

908 阅读1分钟

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 FastViewHolder<T> extends RecyclerView.ViewHolder{
  public FastViewHolder(View itemView) {
    super(itemView);
  }
  protected void onCreate(){
  }
  public <T extends View> 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<String> {
}

如何刷新数据

Adapter刷新时需要通知ViewHolder实现类的方法,那如何实现?
因为ViewHolder实现类是继承FastViewHolder的,所以我们只需像下面这样即可:

  @Override public void onBindViewHolder(FastViewHolder holder, int position) {
    holder.refreshItem(mDatas.get(position).getData());
  }

然后ViewHolder的实现类就能接收到refreshItem方法,做相应的业务代码即可。

Demo

FastAdapter,欢迎大家给小星星