CleanRecyclerViewAdapter
Github
前言
首先,我想先感谢下MultiType这个开源项目,我的部分灵感来源于此。
因为业务的需要,我们可能会需要在一个列表中展示非常多样式的元素,这样的话,我们会需要写很多的viewholder,给每种元素声明一个viewtype,在adapter中写一长串的判断语句来createviewholder。如果要展示的项目样式非常多,那么我们的adapter会非常臃肿,还需要定义非常多的viewtype。当可能要修改、删除、添加一个新的样式的时候,都需要在adapter中做修改,违反了对修改关闭的原则。
优点
- 利用注解将ViewHolder和Adapter解耦,ViewHolder的管理分布在多个ViewHolderFactory中, 增删ViewHolder只需要在相应的ViewHolderFactory中进行。
- 无需定义繁多的ViewType,无需在Adapter中写很多的判断语句,无需在Activity处写绑定的语句,所有绑定操作在CleanViewHolderGenerateHelper中处理所有的ViewHolderFactory来完成。
- 便于ViewHolder的复用,在需要将ViewHolderFactory中包含的ViewHolder展示在多个Adapter中时,只需要将该ViewHolderFactory通过注解生成的ViewHolderFactoryListCreator的静态方法返回的List添加到相应的Adapter中。
- 从现有代码切换成本较低,对现有代码影响较小。只需要将现有的ViewHolder改自继承BaseCleanViewHolder或者BaseCleanExtraDataViewHolder,并为每种数据类型增加一个ViewHolderFactory即可。
如何引用
在项目的build.gradle文件中的dependicies中添加以下依赖。
implementation 'com.baymax.clean_adapter:clean_adapter:0.1.0'
implementation 'com.baymax.clean_adapter:clean_adapter_annotation:0.1.0'
annotationProcessor 'com.baymax.clean_adapter:clean_adapter_compiler:0.1.0'
如何使用
创建ViewHolder
所有的ViewHolder都需要继承自BaseCleanViewHolder或者BaseCleanExtraDataViewHolder并实现onBindViewHolder方法。
- BaseCleanExtraDataViewHolder,会在onBindViewHolder中传入ExtraData,适用于需要使用外部数据的ViewHolder
- BaseCleanViewHolder,不会在onBindViewHolder时传入ExtraData,适用于不需要使用外部数据的ViewHolder
public class AppleViewHolder extends BaseCleanExtraDataViewHolder<Fruit, MarketInfo> {
private TextView fruitName;
public AppleViewHolder(ViewGroup parent) {
super(parent, R.layout.layout_apple_viewholder);
fruitName = findViewById(R.id.name);
}
@Override
public void onBindViewHolder(Fruit fruit, MarketInfo marketInfo) {
fruitName.setText(fruit.name);
}
}
public class PorkViewHolder extends BaseCleanViewHolder<Meat> {
private TextView meatName;
public PorkViewHolder(ViewGroup parent) {
super(parent, R.layout.layout_pork_viewholder);
meatName = findViewById(R.id.name);
}
@Override
public void onBindViewHolder(Meat meat) {
meatName.setText(meat.name);
}
}
BaseCleanExtraDataViewHolder有两个构造函数。一般来说,重写带ViewGroup参数的构造函数,便于在ViewHolderFactory的抽象类中通过反射来初始化ViewHolder。
/**
* 一般情况下请重写本构造函数
* 本构造函数可以确保所有的ViewHolder拥有相同的参数,比如单参数ViewGroup
* 这样可以写一个实现了{@link IViewHolderFactory}的抽象类
* 实现{@link IViewHolderFactory#create(ViewGroup, Class)}方法,在该方法中使用反射初始化ViewHolder
* 这样可以减少大量的初始化ViewHolder的代码
*/
public BaseCleanExtraDataViewHolder(ViewGroup parent, @LayoutRes int layoutId) {
super(