Android |(十八)RecyclerAdapter框架——BRVAH

目录

一、BaseQuickAdapter

二、使用步骤

(一)框架引入

1.build.grade(project:你的项目)

2.build.grade(Module:app)

(二)基础使用

1.准备工作

2.RecycleView基本配置

3.相关代码


系列文章:

Android |(六)基础控件10 RecycleView 滑动【进阶】-优快云博客

Android |(十七)Adapter 适配器-优快云博客

可能用到的知识:
JAVA构造方法

官网:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
官方指南:BRVAH官方使用指南(持续更新) - 简书

最新版本:Releases · CymChad/BaseRecyclerViewAdapterHelper · GitHub

参考指南:RecyclerView框架——BRVAH3.x使用指南

        暑假实习熟悉项目时,发现很多RecyclerView的Adapter类都继承了一个名为BaseQuickAdapter的类,上网查询这是由BRVAH(Base RecyclerViewAdapter Helper)提供的万用适配器,相比原始的适配器,能减少70%的代码。

一、BaseQuickAdapter

/*Kotlin语言
 *继承自RecyclerView.Adapter,并指定泛型参数为VH
 *abstract  抽象类
 *T         数据类型参数,适配器中的数据项类型
 *VH        泛型类型参数,继承自BaseViewHolder
 *@JvmOverloads Kotlin的注解,用于指示编译器为这个构造函数生成额外的重载方法,以便在Java代码中使用时可以提供默认参数值。
 *@LayoutRes    Kotlin的注解,用于指示接下来的参数是一个布局资源ID
 *data          构造函数的另一个参数,是一个可空的MutableList<T>类型,表示数据列表。它有一个默认值null
 *
*/
abstract class BaseQuickAdapter<T, VH : BaseViewHolder>@JvmOverloads constructor(
    @LayoutRes private val layoutResId: Int,
    data: MutableList<T>? = null)

    : RecyclerView.Adapter<VH>() {

}

二、使用步骤

(一)框架引入

1.build.grade(project:你的项目)

注意:如果编译报错如下,说明重复配置了repositories。

Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by build file 'build.gradle'

解决方案:删除多余的repositories定义,比如settings.gradle中的定义
注意:不要忘了将原来settings.grade中的其他设置迁移到repositories,比如google() mavenCentral()等

建议:可以全局搜索关键字:repositories,保证只在根目录的build.gradle中定义,其他gradle中的repositories定义删除即可。

//若为build.grade.kts文件
//一定是allprojects里面,不是buildscript
allprojects {
    repositories { 
        maven { 
            setUrl ("https://jitpack.io") 
        }
    }
}
//若为build.grade文件
allprojects {
   repositories {
      maven { url "https://jitpack.io" }
    }
}

2.build.grade(Module:app)

//BRAVH从2.x升级到3.x为不完全兼容升级,不同版本之间的代码差异可能较大
//这里以3.0.11为例
implementation("com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.11")

(二)基础使用

需求:显示多张图片及其名称

1.准备工作

(1)itemBean实体类:存储 图片名称和图片资源Id

package com.example.brvah3.bean;

public class itemBean {
    //存储图片名称 图片路径
    private String imgName;
    private int imgResId;

    //构造函数、get和set方法(此处省略)
}

2.RecycleView基本配置

(1)RecycleView + item_data.xml + 适配器

(2)3项初始化

(3)设置适配器 recyclerView.setAdapter(adapter);

3.相关代码

建议将代码敲下来,认真理解

package com.example.recycleview.BRVAH3;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.example.recycleview.BRVAH3.bean.itemBean;
import com.example.recycleview.R;

import java.util.List;

/**
 * 两个泛型:数据类型 和 ViewHolder(一般直接写BaseViewHolder)
 */
public class Adapter extends BaseQuickAdapter<itemBean, BaseViewHolder> {

    /** 构造函数1,只接受布局资源ID,初始化适配器时不带数据*/
    public Adapter(int layoutResId) {
        super(layoutResId); // 调用父类的构造函数
    }

    /** 构造函数2,接受布局资源ID和数据列表,初始化适配器时带数据
     * @param data 初始数据列表,可以为null
     */
    public Adapter(int layoutResId, @Nullable List<itemBean> data) {
        super(layoutResId, data); // 调用父类的构造函数,并传递数据列表
    }

    /**convert:将数据绑定到视图
     * 需要重写以实现数据到视图的绑定逻辑
     * @param helper 当前item的ViewHolder(名字是自己改的)
     * @param item 当前item的数据对象
     */
    @Override
    protected void convert(@NonNull final BaseViewHolder helper, itemBean item) {
        helper.setText(R.id.tv_name,item.getImgName());
        helper.setImageResource(R.id.iv_image,item.getImgResId());
    }
}

package com.example.recycleview.BRVAH3;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import com.example.recycleview.BRVAH3.bean.itemBean;
import com.example.recycleview.R;

import java.util.ArrayList;
import java.util.List;

public class MainActivity3 extends AppCompatActivity {

    //名称
    private String imgName[] ={
            "苹果","香蕉","荔枝","梨","菠萝","西瓜",
            "苹果","香蕉","荔枝","梨","菠萝","西瓜",
            "苹果","香蕉","荔枝","梨","菠萝","西瓜",
            "苹果","香蕉","荔枝","梨","菠萝","西瓜"};
    //图片
    private int imgResId[] = {
            R.drawable.apple,R.drawable.banana, R.drawable.litchi,R.drawable.pear,R.drawable.pineapple,R.drawable.watermelon,
            R.drawable.apple,R.drawable.banana, R.drawable.litchi,R.drawable.pear, R.drawable.pineapple,R.drawable.watermelon,
            R.drawable.apple,R.drawable.banana, R.drawable.litchi,R.drawable.pear,R.drawable.pineapple,R.drawable.watermelon,
            R.drawable.apple,R.drawable.banana, R.drawable.litchi,R.drawable.pear,R.drawable.pineapple,R.drawable.watermelon,};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        //初始化RecyclerView
        RecyclerView recyclerView = findViewById(R.id.recyclerBRVAH3);
        recyclerView.setLayoutManager(new GridLayoutManager(this,3));
        //初始化数据
        List<itemBean> dataList = initData();
        //初始化适配器
        Adapter adapter = new Adapter(R.layout.item_data);
        adapter.setNewInstance(dataList);

        //设置适配器
        recyclerView.setAdapter(adapter);
    }
    public List<itemBean> initData(){
        List<itemBean> dataList = new ArrayList<>();
        for (int i = 1;i< imgName.length;i++){
            dataList.add(new itemBean(imgName[i],imgResId[i]));
        }
        return dataList;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="15dp"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:scaleType="fitXY"
        android:src="@drawable/apple" />


    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="苹果"
        android:layout_gravity="center"
        android:textSize="22sp"
        android:textStyle="bold" />

</LinearLayout>

### ViewBinding 结合 BRVAH 框架的使用 #### 1. 基本概念 BRVAH(BaseRecyclerViewAdapterHelper)是一个用于简化 `RecyclerView` 开发的库,提供了高效的适配器管理方式以及丰富的功能支持[^1]。而 ViewBinding 是 Android 官方推出的一种机制,旨在减少 findViewById 调用并提供更安全的视图访问方式。 两者结合可以进一步提升开发效率和代码可读性。以下是具体的实现方法及其最佳实践: --- #### 2. 配置环境 为了使 ViewBinding 和 BRVAH 正常工作,需先配置项目的 build.gradle 文件: ```gradle android { ... viewBinding { enabled = true } } ``` 此设置启用模块级别的 ViewBinding 功能[^3]。 --- #### 3. 自定义 BaseViewHolder 创建一个通用的 ViewHolder 类来集成 ViewBinding 和 BRVAH 的特性: ```kotlin abstract class BindingHolder<B : ViewDataBinding>(val binding: B) : BaseViewHolder(binding.root) { override fun convert(helper: BaseViewHolder, item: Any?) { bind(item as? T ?: return) } @Suppress("UNCHECKED_CAST") private fun bind(item: T) { bindItem(binding, item) binding.executePendingBindings() bindAfterExecute(binding, item) } abstract fun bindItem(binding: B, item: T) open fun bindAfterExecute(binding: B, item: T) {} } ``` 上述代码中,`bindItem` 方法负责核心的数据绑定逻辑,而 `bindAfterExecute` 则允许开发者在数据绑定完成后执行其他操作。 --- #### 4. 创建 Adapter 并关联 Layout 假设有一个简单的布局文件 `item_user.xml`,可以通过以下方式将其与 BRVAH 关联起来: ```kotlin class UserAdapter : BaseQuickAdapter<UserData, BindingHolder<ItemUserBinding>>(R.layout.item_user) { override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemUserBinding> { val binding = ItemUserBinding.inflate(LayoutInflater.from(parent.context), parent, false) return BindingHolder(binding) } override fun convert(holder: BindingHolder<ItemUserBinding>, item: UserData) { holder.bindItem(holder.binding, item) } } fun BindingHolder<ItemUserBinding>.bindItem(binding: ItemUserBinding, item: UserData) { with(binding) { tvName.text = item.name tvAge.text = "${item.age} years old" } } ``` 这里的关键在于重写了 `onCreateDefViewHolder` 方法,利用 LayoutInflater 来实例化 ViewBinding 对象。 --- #### 5. 数据填充 最后,在 Activity 或 Fragment 中初始化 RecyclerView 并设置 Adapter: ```kotlin val adapter = UserAdapter() rvUsers.adapter = adapter adapter.setNewInstance(listOf( UserData(name = "Alice", age = 25), UserData(name = "Bob", age = 30) )) ``` 通过调用 `setNewInstance` 更新列表数据[^4]。 --- #### 6. 最佳实践 - **分离关注点**:将复杂的业务逻辑移至 `bindAfterExecute` 方法中,保持主线程流畅运行。 - **避免内存泄漏**:确保在生命周期结束时解除所有不必要的引用关系。 - **充分利用工具链**:借助 Lint 工具检测潜在问题,并定期更新依赖版本以获取最新修复和支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值