目录
系列文章:
Android |(六)基础控件10 RecycleView 滑动【进阶】-CSDN博客
Android |(十七)Adapter 适配器-CSDN博客
可能用到的知识:
JAVA构造方法
官网:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
官方指南:BRVAH官方使用指南(持续更新) - 简书最新版本:Releases · CymChad/BaseRecyclerViewAdapterHelper · GitHub
暑假实习熟悉项目时,发现很多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>