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方法,做相应的业务代码即可。
首先我们看看以前的写法:
```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 ,欢迎大家给小星星