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

  • 优势:代码简洁、功能丰富(支持多类型条目、动画、头部/尾部布局、事件绑定等)。
  • 适用场景:快速开发复杂列表界面(如电商商品列表、聊天消息列表、任务管理等)。
相关推荐
mykrecording39 分钟前
launch Activity流程
android·app
不知名的前端专家2 小时前
uniapp 安卓FTP上传下载操作原生插件
android·uni-app
ClassOps3 小时前
Android Studio Logcat中 杀死应用
android·android studio·logcat
lagelangri6663 小时前
MySql的存储过程以及JDBC实战
android·数据库·mysql
指针不南3 小时前
Android Studio | 设置国内代理(SDK 设置国内代理(阿里云镜像))
android·阿里云·android studio
Knock man3 小时前
Android AIDL通信案例
android
2501_916013748 小时前
iOS 26 系统流畅度检测 从视觉特效到帧率稳定的实战策略
android·macos·ios·小程序·uni-app·cocoa·iphone
秋月的私语8 小时前
如何快速将当前的c#工程发布成单文件
android·java·c#
、BeYourself13 小时前
Android 常见界面布局详解
android
weixin_4111918413 小时前
安卓Handler+Messenger实现跨应用通讯
android