一个RecyclerView实现多级折叠列表(TreeRecyclerView)

前言

不得不吐槽一下产品. 尼玛为啥要搞这样的功能.... 搞个两级的不就行了嘛...自带控件,多好. 三级,四级,据说还有六级的.... 这样丧心病狂的设计,后台也很差给数据吧.java

2018年更新:

因为迭代了不少版本,老的文章内容已经不适用,更新一下.git

效果及实现代码:

如下实现都只用一个RecycerView,没有嵌套.github

三级列表:

Paste_Image.png

购物车:

image.png

分类快速定位:

image.png

综合(头部,侧滑,定位,折叠):

image.png

多样式列表:

image.png

如何使用,这里只列出折叠的使用方法:

一.你须要建立一个adapter:

//根据item的状态展现,可折叠
    TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);
复制代码

二.你须要选择一种展开方式

image.png

public TreeRecyclerAdapter() {
        this(null);
    }

    public TreeRecyclerAdapter(TreeRecyclerType treeRecyclerType) {
        type = treeRecyclerType == null ? TreeRecyclerType.SHOW_DEFAULT : treeRecyclerType;
    }
复制代码

构造函数传入,不传默认则使用SHOW_DEFAULT.bash

三.写具体展现的item

注意! 使用这个,没有写ViewHolder的概念,只有TreeItem和TreeItemGroupide

简单的TreeItemGroup示例,第二级 市:
/**
* 城市
 */
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());
    }
}
复制代码

简单的TreeItem示例,第三级城市:
/**
* 县
 */
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函数

怎么建立Item呢?

有两种方法:ui

1.在javabean上使用注解:
@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

2.直接传入item的class,建立item
//建立item
 List<TreeItem> provinceItemList = ItemHelperFactory.createItems(cityBeen, ProvinceItemParent.class, null);
 List<TreeItem> items = ItemHelperFactory.createItems(cityBeen, null);
复制代码

这2行代码,效果上是同样的.设计


四.如何更新adapter:

image.png

五,如何设置点击:

条目点击

1.重写TreeItemonClick():

image.png
2. adapter设置 setOnItemClickListener

adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull ViewHolder viewHolder, int position) {
       
            }
        });
复制代码

注意.两者冲突


下面附上github地址,里面有Demo,

传送门:TreeRecyclerView 欢迎Star,哈哈

您的喜欢与回复是我最大的动力,欢迎评论补充.

相关文章
相关标签/搜索