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

  • 优势:代码简洁、功能丰富(支持多类型条目、动画、头部/尾部布局、事件绑定等)。
  • 适用场景:快速开发复杂列表界面(如电商商品列表、聊天消息列表、任务管理等)。
相关推荐
studyForMokey5 分钟前
【Android 项目】个人学习demo随笔
android
吃喝不愁霸王餐APP开发者5 分钟前
利用责任链模式解耦多平台(美团/饿了么)霸王餐接口的适配逻辑
android·责任链模式
百***787519 分钟前
Step-Audio-2 轻量化接入全流程详解
android·java·gpt·php·llama
yangpipi-3 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
云水木石4 小时前
Android 的下一个战场:Windows 应用与游戏?
android·windows·游戏
雨声不在5 小时前
Android文字渐变的实现
android·textview
GoldenPlayer5 小时前
KTS语法
android
GoldenPlayer5 小时前
后台服务Service销毁逻辑+单例造成的内存泄露
android
GoldenPlayer5 小时前
自定义APK&gradle全局配置文件
android
うちは止水5 小时前
Android Hal层开发流程
android·hal