解耦、灵活、复用性强的多样式RecyclerView解决方案

CleanRecyclerViewAdapter是一个解耦、灵活的RecyclerView解决方案,通过ViewHolderFactory和Adapter的解耦,简化了视图创建和管理。它允许在无需大量判断代码的情况下处理多样式列表,方便增删ViewHolder,提高代码复用性。同时,它支持ExtraData参数,方便在ViewHolder中访问额外数据。
摘要由CSDN通过智能技术生成

CleanRecyclerViewAdapter

Github

前言

首先,我想先感谢下MultiType这个开源项目,我的部分灵感来源于此。

因为业务的需要,我们可能会需要在一个列表中展示非常多样式的元素,这样的话,我们会需要写很多的viewholder,给每种元素声明一个viewtype,在adapter中写一长串的判断语句来createviewholder。如果要展示的项目样式非常多,那么我们的adapter会非常臃肿,还需要定义非常多的viewtype。当可能要修改、删除、添加一个新的样式的时候,都需要在adapter中做修改,违反了对修改关闭的原则。

优点

  1. 利用注解将ViewHolder和Adapter解耦,ViewHolder的管理分布在多个ViewHolderFactory中, 增删ViewHolder只需要在相应的ViewHolderFactory中进行。
  2. 无需定义繁多的ViewType,无需在Adapter中写很多的判断语句,无需在Activity处写绑定的语句,所有绑定操作在CleanViewHolderGenerateHelper中处理所有的ViewHolderFactory来完成。
  3. 便于ViewHolder的复用,在需要将ViewHolderFactory中包含的ViewHolder展示在多个Adapter中时,只需要将该ViewHolderFactory通过注解生成的ViewHolderFactoryListCreator的静态方法返回的List添加到相应的Adapter中。
  4. 从现有代码切换成本较低,对现有代码影响较小。只需要将现有的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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值