项目 gradle.properties
android.useAndroidX=true
android.enableJetifier=true
项目根目录 build.gradle
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
项目 build.gradle
implementation 'com.gitee.raoqian156:RV-Adapter:v1.2.15'
混淆
-keep public class * extends com.rq.rvlibrary.BaseViewHolder { *;}
mAdapter = new BaseAdapter(this, R.layout.item_example) {
@Override
protected void onBindEasyHolder(BaseAdapter adapter, BaseViewHolder holder, int position, Object o) {
holder.setItemText(R.id.txt, (String) o);
}
};
new RecyclerUtil(mAdapter).set2View(recyclerView);
//横向布局
//new RecyclerUtil(mAdapter).horizontal().set2View(recyclerView);
List<String> debug = new ArrayList<>();
debug.addAll(getDebugData());
mAdapter.setData(debug);
mAdapter = new BaseAdapter(this, R.layout.item_example,ExampleViewHolder1.class);
// 当 ExampleViewHolder1 为内部类时使用下个方法
// mAdapter = new BaseAdapter(this, R.layout.item_example,ExampleViewHolder1.class,this);
new RecyclerUtil(mAdapter).set2View(recyclerView);
List<String> debug = new ArrayList<>();
debug.addAll(getDebugData());
mAdapter.setData(debug);
public class ExampleViewHolder1 extends BaseViewHolder<String> {
public ExampleViewHolder1(View itemView) {
super(itemView);
}
@Override
public int inflateLayoutId() {
return R.layout.item_example;
}
@Override
public void fillData(BaseAdapter adapter, int position, String o) {
setItemText(R.id.txt, o);
}
}
该布局模式下可接收不同数据列表 如下代码,新建 SparseArray 设置数据展示规则(布局文件为key),重写 getMultipleHolderType 给出布局文件,同样的修改 onBindMultipleHolder 优先级低于 ViewHolder#fillData
SparseArray layList = new SparseArray();
layList.append(R.layout.item_example3, EasyViewHolder.class);
layList.append(R.layout.item_example, ExampleViewHolder1.class);
layList.append(R.layout.item_example2, ExampleViewHolder2.class);
mAdapter = new BaseAdapter(this, layList) {
@Override
protected int getMultipleHolderType(Object dataItem, int position) {
if (dataItem instanceof Integer) {
return R.layout.item_example3;
}
String data = (String) dataItem;
if (position < 4 && position >= 0) return R.layout.item_example3;
if (data.contains("1")) return R.layout.item_example2;
return R.layout.item_example;
}
@Override
protected void onBindMultipleHolder(BaseAdapter adapter, BaseViewHolder holder, int position,
Object o) {
if (holder instanceof ExampleViewHolder2) {
if (o instanceof Integer) {
holder.setItemText(R.id.txt, "Holder2 数字:" + o);
} else {
holder.setItemText(R.id.txt, "Holder2:" + o);
}
} else if (position >= 0) if (o instanceof Integer) {
holder.setItemText(R.id.txt, "数字:" + o);
} else {
holder.setItemText(R.id.txt, (String) o);
}
}
};
new RecyclerUtil(mAdapter).set2View(recyclerView);
List debug = new ArrayList<>();
debug.add("1 $$$$");
debug.add("2 $$$$");
debug.add("3 3");
debug.add("4 24");
debug.add(18);
debug.add(19);
debug.add("5 51");
debug.add("13 3331678901");
debug.add("14 2678902");
debug.add("15 555555536789033");
debug.add("16 66664678904");
debug.add("17---***");
debug.add("20***");
debug.add(21);
debug.add(22);
debug.add("23333333333");
debug.add("244444");
mAdapter.setData(debug);
public class DRVH extends NestingViewHolder {
public DRVH(View itemView) {
super(itemView);
}
@Override
public int inflateLayoutId() {
return R.layout.item_parent;//外层布局 与 Adapter 创建时对应 new BaseAdapter(this, R.layout.item_parent, DRVH.class);
}
@Override
protected void fillChildData(EasyViewHolder holder, int position, Object childBean, int pPostion) {
super.fillChildData(holder, position, childBean, pPostion);
DebugData item = (DebugData) childBean;
holder.setItemText(R.id.text_time, item.time);
holder.setItemText(R.id.text_ml, item.num);
}
@Override
protected List getChildData(Object parentBean, int position) {
return (List) parentBean;
}
@Override
protected RecyclerUtil getChildRecyclerUtil(BaseAdapter adapter) {
return new RecyclerUtil(adapter).horizontal();
}
@Override
protected int getChildLayoutId() {
return R.layout.item_child;
}
@Override
protected int getChildRecyclerId() {
return R.id.recycler_inner;
}
}
BaseAdapter.setDisplay() 设置数据本地展示条件,BaseAdapter.display(Object rule)根据规则 内容展示数据,null-清除展示条件,全部展示
mAdapter.setDisplay(new BaseAdapter.DisplayOption<String>() {
@Override
public boolean show(String data,@NonNull Object rule, int position) {
//自定义显示条件 true->显示 false->隐藏
if (rule instanceof String) {
return data.contains((String) rule);
}
return true;
}
});
//调用
Object rule = null;//rule = "2";展示包含数据"2"的条目
mAdapter.display(rule);//展示全部数据
<1>BaseAdapter 实体类 调用 addOnItemClickListener ,具体使用方法见Java文件
<2>继承 ViewHolder 实现 OnInterceptClick 接口,具体使用方法见Java文件;此方法优先级高于方法<1>,intercept()
返回 true 则不会回调 方法<1> 接口.
RecyclerUtil 中封装了大量的显示方法(详见代码),该工具的创建 需要传入创建好的 BaseAdapter
1.RecyclerUtil.set2View() 此方法为绑定视图作用,将传入的Adapter 与 RecyclerView 绑定
2.RecyclerUtil.row() 此方法修改显示列数 默认为 1 为线性布局
3.RecyclerUtil.horizontal/vertical() 此方法修改显示布局方向 默认为垂直方向
4.若以上方法不能满足使用,可使用 RecyclerUtil.setLayoutManager() 传入自定义LayoutManager 进行布局控制
BaseViewHolder 的继承使用时,必须实现inflateLayoutId方法,该方法的实现主要是为了后期维护的方便
HeadViewHolder代码
public class HeadViewHolder extends BaseViewHolder implements OnInterceptClick {
@OnClick({R.id.txt_left, R.id.txt_right})
@Override
public boolean intercept(Object object, View v, int position) {
if (v.getId() == R.id.txt_left) {
Toast.makeText(v.getContext(), "LEFT", Toast.LENGTH_LONG).show();
} else if (v.getId() == R.id.txt_right) {
Toast.makeText(v.getContext(), "RIGHT", Toast.LENGTH_LONG).show();
}
return false;
}
/**
*
* 废弃,使用Onclick 注解
*/
@Override
public int[] clickIds() {
return new int[]{R.id.txt_left, R.id.txt_right};
}
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);
}
@Override
public int inflateLayoutId() {
return R.layout.item_head_view;
}
@Override
public void fillData(BaseAdapter adapter, int position, Object data) {
super.fillData(adapter, position, data);
if (data instanceof DebugData) {
DebugData bean = (DebugData) data;
if (bean.isLeft) {
setItemText(R.id.txt_left, bean.realContent);
} else {
setItemText(R.id.txt_right, bean.realContent);
}
}
}
}
public static class ValueBean implements OnDataBinding {
private String activeDesc;
@Override
public void bindViewHolder(BaseAdapter adapter, BaseViewHolder holder, int position,
Object data) {
if (holder.layoutId() == R.layout.item_demo) {
holder.setItemText(R.id.tv_title, getActiveDesc());
//也可以直接操作 View
//View v= holder.itemView.findViewById(**);
}
}
}
4.1 使用时调用 BaseAdapter.openDiffUtil(false);
4.2 数据类实现 com.rq.rvlibrary.Compare 即可.
##更新列表 1.v1.1.2 2021-08-20 BaseAdapter 增加 onBindHeadHolder 和 onBindFootHolder 方法,头尾试图不再回调 onBindMultipleHolder 、onBindEasyHolder方法 继承BaseViewHolder 则仍然使用 fillData 方法,position < 0 则为头尾数据,可调用 isHeadView 或 isFootView 判断数据位置
2.v1.2.10 2022-02-21 增加了双层RecyclerView适配方案,继承DRViewHolder,具体使用方法见 DRViewHolder 文件
3.v1.2.14 2023-02-16 BaseViewHolder 加入Onclick 点击事件配置方法,简化点击事件拦截方式(取代 clickIds() ) BaseAdapter 加入判断方法 ,未重写 onBindEasyHolder 的情况下,可在 onBindMultipleHolder 中进行数据显示设置
4.v1.2.15 2023-02-23 重写嵌套布局,DRViewHolder更名为 NestingViewHolder ,加入使用示例 DoubleAct 类
4.v1.2.16 2023-03-15 加入 DiffUtil 的应用
5.2023-07-03 加入数据保持(移除后数据同步)示例
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型