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檔案
### 未完待續...