AdapterDemo
RecyclerView 万能适配器
(一)androidX 使用
项目 gradle.properties
android.useAndroidX=true
android.enableJetifier=true
项目 build.gradle
implementation 'com.rq.adapter:androidx_rvlib:1.0.0'
(二)v7 使用
项目 build.gradle
~~implementation 'com.rq.adapter:android_rvlib:1.0.0'~~
注:两个版本的使用方法,基本一致,只是导入的支持包不一样,根据项目具体使用的包调整,
,后续更新以及使用细则皆以 androidx_rvlib 最新包作说明
适配器主要思路是一个业务(同一种Item)内容需要新建一个ViewHolder 继承自 BaseViewHolder,
BaseAdapter 则只需要实例化一个即可,常规使用直接 new BaseAdapter(Context,int,Class)即可
具体的视图业务在ViewHolder 的 fillData(int position, Object data) 方法即可,如以下代码:
public class ExampleViewHolder extends BaseViewHolder {
public ExampleViewHolder(View itemView) {
super(itemView);
}
@Override
public void fillData(int position, String data) {
super.fillData(position, data);
//setTextToView(R.id.txt, data);
setItemText(R.id.txt, data);
}
}
使用细则:
1.BaseAdapter 的构造函数中,最后一个参数innerClassContext为可选参数 为 Object... 的都是针对使用内部ViewHolder类的,因为反射需要
注意要为 public * ,若ViewHolder为单独的文件或者静态内部类则无需传入此参数
2.数据填充调用setData()即可,添加数据则调用addData();
3.BaseAdapter.setDisplay() 设置数据本地展示条件,BaseAdapter.display(Object rule)根据规则
内容展示数据,null-清除展示条件,全部展示;
4.添加点击事件
主类逻辑
```
@Override
public void onAction(int action, Object data) {
HeadViewHolder.DebugData bean = (HeadViewHolder.DebugData) data;
if (action == R.id.txt_left) {
Toast.makeText(MainActivity.this, "点击了左边->" + (bean == null ? "null" : bean.realContent), Toast.LENGTH_SHORT).show();
} else if (action == R.id.txt_right) {
Toast.makeText(MainActivity.this, "点击了右边-> " + (bean == null ? "null" : bean.realContent), Toast.LENGTH_SHORT).show();
}
}
private void showHeadViewHolder() {
mAdapter.setActionPasser(this);
mAdapter.addOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(BaseAdapter adapter,BaseViewHolder holder, Object bean, View view, int position) {
Log.e("MainActivity", "onItemClick:bean ->" + bean);
Log.e("MainActivity", "onItemClick:holder ->" + holder);
Log.e("MainActivity", "onItemClick:view ->" + view);
Log.e("MainActivity", "onItemClick:position ->" + position);
}
});
mAdapter.setHeadHolder(1, null, HeadViewHolder.class, R.layout.item_head_view);
}
HeadViewHolder代码
public class HeadViewHolder extends BaseViewHolder implements View.OnClickListener {
public static class DebugData {
public DebugData(boolean isLeft, String realContent) {
this.isLeft = isLeft;
this.realContent = realContent;
}
boolean isLeft = false;
String realContent;
}
public HeadViewHolder(View itemView) {
super(itemView);
itemView.findViewById(R.id.txt_left).setOnClickListener(this);
itemView.findViewById(R.id.txt_right).setOnClickListener(this);
}
@Override
public int inflateLayoutId() {
return R.layout.item_head_view;
}
@Override
public void fillObject(@Nullable Object data) {
super.fillObject(data);
if (data instanceof DebugData) {
DebugData bean = (DebugData) data;
if (bean.isLeft) {
//setTextToView(R.id.txt_left, bean.realContent);
setItemText(R.id.txt_left, bean.realContent);
} else {
//setTextToView(R.id.txt_right, bean.realContent);
setItemText(R.id.txt_right, bean.realContent);
}
}
}
@Override
public void onClick(View view) {
if (mActionPasser != null) {
mActionPasser.onAction(view.getId(), getData());
}
}
}
混淆
-keep public class * extends com.rq.rvlibrary.BaseViewHolder { *;}
##### 2020-04-28更新:
1.移除 v4 v7 兼容版本,需要使用的下载androidX版本,然后通过编译按照编译器指示重新导包
2.移除 setChildClick 方法,统一使用 addOnItemClickListener
3.精简BaseAdapter类,加入子项数据获取方法,加入无数据空数据布局显示
##### 2020-08-13更新:
1.增加 OnInterceptClick 回调,子Item只需要实现该接口便可以完成点击逻辑,与 addOnItemClickListener 兼容,使用方式查看 OnInterceptClick 注释
##### 2021-04-07更新:
1.修改 OnItemClickListener 回调 ,增加回调参数
2.BaseViewHolder.setTextToView() --更名--> setItemText()
3.增加 AdapterHolderController 接口,ViewHolder实现该接口可控制RV数据变化
4.AD增加 onBindEasyHolder 方法,重载可快速实现数据填充,无需新建ViewHolder文件
### 未完待续...