RecyclerView 多布局适配器
在项目中难免会遇到多种item的列表。功能实现也很简单,大概思路就是通过覆写getItemViewType ,动态的分出类型 然后创建不同的ViewHolder,实现我们的功能。但是这是常规套路,如果item类型太多,难免Adapter代码臃肿,难以维护。就拿目前开发的项目来说,有6种单据,每种单据类型展示的item都不一样。于是,便决定“优化”一下代码。
反复考虑后,我的思路是,将创建和绑定数据这部分业务逻辑抽象出去,通过依赖Adapter原有的“生命周期”来调用具体实现业务逻辑的对象,废话不多说,代码实现也许更直观一些。
首先定义实体模拟一下项目的需求:
`
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
}
`
我们假设每一种动物为不同的ItemViewType。
然后定义接口
`
public interface Adapter<T> {
/**
* 创建适配器
*
* @param parent
* @return
*/
@NonNull
RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent);
/**
* 绑定数据
*/
void onBindViewHolder(@NonNull T items, @NonNull RecyclerView.ViewHolder holder, int position);
}
`
具体实现逻辑的Adapter类型
`
public class CatAdapter implements Adapter<List<Cat>> {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_cat, parent, false);
return new CatViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull List<Cat> items, @NonNull RecyclerView.ViewHolder holder, int position) {
Cat cat = items.get(position);
((CatViewHolder) holder).mName.setText(cat.getName());
}
static class CatViewHolder extends RecyclerView.ViewHolder {
TextView mName;
public CatViewHolder(View itemView) {
super(itemView);
mName = itemView.findViewById(R.id.tv_name);
}
}
}
public class DogAdapter implements Adapter<List<Dog>> {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_dog, parent, false);
return new DogViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull List<Dog&g