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

RecyclerView 在Android开发中可以说是使用频率非常高的组件了,本着不造重复轮子的原则,今天我们来打造一个通用且能快速使用的Adapter。


首先我们看看以前的写法:
```java
  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基类
```java
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
```java
  FastAdapter fastAdapter = new FastAdapter(context);
  fastAdapter.addItem(TextViewHolder.class);
```


3.利用反射创建ViewHolder实现类
```java
  FastViewHolder fastViewHolder = fastBaseViewHolderClass.getConstructor(View.class).newInstance(itemView);
  fastViewHolder.onCreate();
```
4.itemView的创建
ViewHolder的构造方法需要itemView,我们可以在ViewHolder里添加一个注解,类似下面这样:
```java
@RecyclerItemLayoutId(R.layout.item_text)
public class TextViewHolder extends FastViewHolder<String> {
}
```




#### 如何刷新数据
Adapter刷新时需要通知ViewHolder实现类的方法,那如何实现?
因为ViewHolder实现类是继承FastViewHolder的,所以我们只需像下面这样即可:
```java
  @Override public void onBindViewHolder(FastViewHolder holder, int position) {
    holder.refreshItem(mDatas.get(position).getData());
  }
```
然后ViewHolder的实现类就能接收到refreshItem方法,做相应的业务代码即可。


#### Demo

https://github.com/aizuzi/FastAdapter

FastAdapter ,欢迎大家给小星星

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值