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. 优势与适用场景

  • 优势:代码简洁、功能丰富(支持多类型条目、动画、头部/尾部布局、事件绑定等)。
  • 适用场景:快速开发复杂列表界面(如电商商品列表、聊天消息列表、任务管理等)。
相关推荐
杨筱毅6 分钟前
【Android】Handler/Looper机制相关的类图和流程图
android·java·流程图
Kapaseker1 小时前
酷炫的文字效果 — Compose 文本着色
android·kotlin
努力进修1 小时前
【JavaEE初阶】 多线程编程核心:解锁线程创建、方法与状态的创新实践密码
android·java·java-ee
生莫甲鲁浪戴1 小时前
Android Studio新手开发第二十八天
android·ide·android studio
zhaoyufei1332 小时前
Android触屏TP驱动事件上报以及多点触摸
android
杨筱毅2 小时前
【Android】详细讲解ViewDragHelper的实现原理(不含代码版)
android
代码s贝多芬的音符9 小时前
ios android 小程序 蓝牙 CRC16_MODBUS
android·ios·小程序
2501_9159184111 小时前
iOS 混淆实战 多工具组合完成 IPA 混淆、加固与工程化落地(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
android·ios·小程序·https·uni-app·iphone·webview
雨白11 小时前
让协程更健壮:全面的异常处理策略
android·kotlin
Jeled12 小时前
AI: 生成Android自我学习路线规划与实战
android·学习·面试·kotlin