不得不吐槽一下產品. 尼瑪爲啥要搞這樣的功能.... 搞個兩級的不就行了嘛...自帶控件,多好. 三級,四級,據說還有六級的.... 這樣喪心病狂的設計,後臺也很差給數據吧.java
因爲迭代了不少版本,老的文章內容已經不適用,更新一下.git
如下實現都只用一個RecycerView,沒有嵌套.github
//根據item的狀態展現,可摺疊
TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);
複製代碼
public TreeRecyclerAdapter() {
this(null);
}
public TreeRecyclerAdapter(TreeRecyclerType treeRecyclerType) {
type = treeRecyclerType == null ? TreeRecyclerType.SHOW_DEFAULT : treeRecyclerType;
}
複製代碼
構造函數傳入,不傳默認則使用SHOW_DEFAULT.bash
注意! 使用這個,沒有寫ViewHolder的概念,只有TreeItem和TreeItemGroup
ide
/**
* 城市
*/
public class CountyItemParent extends TreeItemGroup<ProvinceBean.CityBean> {//泛型表明綁定的javabean
//建立子TreeItem.
@Override
public List<TreeItem> initChildList(ProvinceBean.CityBean data) {
return ItemHelperFactory.createItems(data.getAreas(), this);
}
//該級具體展現的Layout
@Override
public int getLayoutId() {
return R.layout.item_two;
}
//view和data綁定
@Override
public void onBindViewHolder(@NonNull ViewHolder holder) {
holder.setText(R.id.tv_content, data.getCityName());
}
}
複製代碼
/**
* 縣
*/
public class AreaItem extends TreeItem<ProvinceBean.CityBean.AreasBean> {//泛型表明綁定的javabean
//這個item的具體展現layout
@Override
public int getLayoutId() {
return R.layout.item_three;
}
//這個Item條目的視圖綁定操做,
@Override
public void onBindViewHolder(@NonNull ViewHolder holder) {
holder.setText(R.id.tv_content, data.getAreaName());
}
//這個Item,在RecyclerView的每行所佔比,只有RecyclerView設置了GridLayoutManager纔會生效.
//這個最好是返回能整出的數.之因此用除法,是爲了能夠作到,只改變GridLayoutManager的總數,無需改變Item
@Override
public int getSpanSize(int maxSpan) {
return maxSpan / 6;
}
}
複製代碼
第一級爲啥沒寫呢? 由於寫法和第二級同樣的,就不寫出來了.具體見demo
函數
有兩種方法:ui
@TreeDataType(iClass = AreaItem.class)
public class AreasBean{
...
}
複製代碼
而後重寫在TreeItemGroup中initChildList()
this
@Override
public List<TreeItem> initChildList(ProvinceBean.CityBean data) {
return ItemHelperFactory.createItems(data.getAreas(), this);
}
複製代碼
這樣,item就生成了.spa
//建立item
List<TreeItem> provinceItemList = ItemHelperFactory.createItems(cityBeen, ProvinceItemParent.class, null);
List<TreeItem> items = ItemHelperFactory.createItems(cityBeen, null);
複製代碼
這2行代碼,效果上是同樣的.設計
1.重寫TreeItem
的onClick()
:
adapter
設置
setOnItemClickListener
adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClick(@NonNull ViewHolder viewHolder, int position) {
}
});
複製代碼
注意.兩者衝突
您的喜歡與回覆是我最大的動力,歡迎評論補充.