Android BaseQuickAdapter的使用

在 Android 开发中,BaseQuickAdapter 是一个基于 RecyclerView 的高效适配器库,能够大幅简化适配器的编写逻辑。以下是其核心用法的详细说明:


1. 添加依赖

首先需要在项目的 build.gradle 文件中添加依赖:

arduino 复制代码
gradle
深色版本
allprojects {
    repositories {
        maven { url "https://jitpack.io" } // BaseQuickAdapter 的仓库地址
    }
}

dependencies {
    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4' // 请根据需求选择最新版本
}

2. 创建适配器

继承 BaseQuickAdapter 并实现 convert 方法,绑定数据到条目布局:

scala 复制代码
java
深色版本
public class MyAdapter extends BaseQuickAdapter<ItemData, BaseViewHolder> {
    public MyAdapter(int layoutResId, List<ItemData> data) {
        super(layoutResId, data); // layoutResId 是条目布局的 ID
    }

    @Override
    protected void convert(BaseViewHolder helper, ItemData item) {
        // 绑定数据到视图
        helper.setText(R.id.tv_title, item.getTitle())
              .setImageResource(R.id.iv_icon, item.getIconRes())
              .setChecked(R.id.checkbox, item.isChecked());

        // 子控件点击事件(需在 convert 中注册)
        helper.addOnClickListener(R.id.checkbox); // 注册 CheckBox 点击事件
    }
}

3. 初始化 RecyclerView

在 Activity 或 Fragment 中设置适配器:

ini 复制代码
java
深色版本
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

List<ItemData> dataList = new ArrayList<>();
dataList.add(new ItemData("Item 1", false));
dataList.add(new ItemData("Item 2", true));

MyAdapter adapter = new MyAdapter(R.layout.item_layout, dataList);
recyclerView.setAdapter(adapter);

4. 处理条目事件

Item 点击/长按事件

arduino 复制代码
java
深色版本
adapter.setOnItemClickListener((adapter, view, position) -> {
    ItemData item = dataList.get(position);
    Toast.makeText(context, "点击了 " + item.getTitle(), Toast.LENGTH_SHORT).show();
});

adapter.setOnItemLongClickListener((adapter, view, position) -> {
    Toast.makeText(context, "长按了 " + position, Toast.LENGTH_SHORT).show();
    return true; // 返回 true 表示事件已消费
});

子控件点击事件

convert 方法中注册子控件点击事件,并通过 onItemChildClickListener 处理:

scss 复制代码
java
深色版本
// 注册子控件点击事件(在 convert 中)
helper.addOnClickListener(R.id.checkbox);

// 设置监听器
adapter.setOnItemChildClickListener((adapter, view, position) -> {
    if (view.getId() == R.id.checkbox) {
        ItemData item = dataList.get(position);
        item.setChecked(!item.isChecked());
        adapter.notifyItemChanged(position); // 数据更新后刷新对应条目
    }
});

5. 添加头部/尾部布局

添加头部

ini 复制代码
java
深色版本
View headerView = LayoutInflater.from(context).inflate(R.layout.header_layout, recyclerView, false);
adapter.addHeaderView(headerView);

添加尾部

ini 复制代码
java
深色版本
View footerView = LayoutInflater.from(context).inflate(R.layout.footer_layout, recyclerView, false);
adapter.addFooterView(footerView);

// 动态控制尾部显示/隐藏
adapter.setFooterViewVisibility(View.GONE); // 初始隐藏

6. 实现动画效果

开启条目加载动画:

typescript 复制代码
java
深色版本
adapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_LEFT); // 左滑进入动画
// 或自定义动画
adapter.openLoadAnimation(new BaseAnimation() {
    @Override
    public Animator[] getAnimators(View view) {
        return new Animator[]{AnimatorInflater.loadAnimator(context, R.anim.slide_in_right)};
    }
});

7. 多类型条目

如果列表包含多种类型的条目,重写 getItemViewType 方法:

arduino 复制代码
java
深色版本
@Override
public int getItemViewType(int position) {
    if (dataList.get(position).isSpecial()) {
        return TYPE_SPECIAL;
    } else {
        return TYPE_NORMAL;
    }
}

并提供对应的 convert 实现。


8. 常见问题与注意事项

  1. 子控件事件未触发 :确保在 convert 方法中通过 addOnClickListener 注册子控件 ID。
  2. 性能优化 :避免在 convert 中频繁创建对象(如 SpannableString)。
  3. 数据更新 :通过 notifyItemChanged(position)notifyDataSetChanged() 刷新数据。
  4. 嵌套 RecyclerView :直接使用 setOnItemClickListener,避免使用 recyclerView.addOnItemTouchListener 防止事件冲突。

9. 示例代码总结

完整示例代码:

scala 复制代码
java
深色版本
public class MyAdapter extends BaseQuickAdapter<ItemData, BaseViewHolder> {
    public MyAdapter(int layoutResId, List<ItemData> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, ItemData item) {
        helper.setText(R.id.tv_title, item.getTitle())
              .setChecked(R.id.checkbox, item.isChecked())
              .addOnClickListener(R.id.checkbox);
    }
}

// 在 Activity 中使用
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

List<ItemData> dataList = new ArrayList<>();
dataList.add(new ItemData("Item 1", false));
MyAdapter adapter = new MyAdapter(R.layout.item_layout, dataList);
recyclerView.setAdapter(adapter);

adapter.setOnItemClickListener((adapter, view, position) -> {
    Toast.makeText(this, "点击了第 " + position + " 项", Toast.LENGTH_SHORT).show();
});

10. 优势与适用场景

  • 优势:代码简洁、功能丰富(支持多类型条目、动画、头部/尾部布局、事件绑定等)。
  • 适用场景:快速开发复杂列表界面(如电商商品列表、聊天消息列表、任务管理等)。
相关推荐
百锦再1 天前
第11章 泛型、trait与生命周期
android·网络·人工智能·python·golang·rust·go
会跑的兔子1 天前
Android 16 Kotlin协程 第二部分
android·windows·kotlin
键来大师1 天前
Android15 RK3588 修改默认不锁屏不休眠
android·java·framework·rk3588
江上清风山间明月1 天前
Android 系统超级实用的分析调试命令
android·内存·调试·dumpsys
百锦再1 天前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
用户69371750013841 天前
Kotlin 协程基础入门系列:从概念到实战
android·后端·kotlin
SHEN_ZIYUAN1 天前
Android 主线程性能优化实战:从 90% 降至 13%
android·cpu优化
曹绍华1 天前
android 线程loop
android·java·开发语言
雨白1 天前
Hilt 入门指南:从 DI 原理到核心用法
android·android jetpack
介一安全1 天前
【Frida Android】实战篇3:基于 OkHttp 库的 Hook 抓包
android·okhttp·网络安全·frida