在 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. 常见问题与注意事项
- 子控件事件未触发 :确保在
convert
方法中通过addOnClickListener
注册子控件 ID。 - 性能优化 :避免在
convert
中频繁创建对象(如SpannableString
)。 - 数据更新 :通过
notifyItemChanged(position)
或notifyDataSetChanged()
刷新数据。 - 嵌套 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. 优势与适用场景
- 优势:代码简洁、功能丰富(支持多类型条目、动画、头部/尾部布局、事件绑定等)。
- 适用场景:快速开发复杂列表界面(如电商商品列表、聊天消息列表、任务管理等)。