Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)

前言

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

2018年更新:

由于迭代了很多版本,老的文章内容已经不适用,更新一下.

效果及实现代码:

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

三级列表:

Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第1张图片

购物车:

Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第2张图片

分类快速定位:

Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第3张图片

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

Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第4张图片

多样式列表:

Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第5张图片

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

一.你需要创建一个adapter:

 //根据item的状态展示,可折叠
   TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);

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

Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第6张图片

   public TreeRecyclerAdapter() {
        this(null);
    }

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

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

三.写具体展示的item

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

简单的TreeItemGroup示例,第二级 市:
/**
* 城市
 */
public class CountyItemParent extends TreeItemGroup {//泛型代表绑定的javabean
    
    //创建子TreeItem.
    @Override
    public List 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 {//泛型代表绑定的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呢?

有两种方法:

1.在javabean上使用注解:
 @TreeDataType(iClass = AreaItem.class)
  public class AreasBean{
  ...
  }

然后重写在TreeItemGroup中initChildList()

  @Override
    public List initChildList(ProvinceBean.CityBean data) {
        return ItemHelperFactory.createItems(data.getAreas(),  this);
    }

这样,item就生成了.

2.直接传入item的class,创建item
 //创建item
 List provinceItemList = ItemHelperFactory.createItems(cityBeen, ProvinceItemParent.class, null);
 List items = ItemHelperFactory.createItems(cityBeen, null);

这2行代码,效果上是一样的.


四.如何更新adapter:

image.png

五,如何设置点击:

条目点击

1.重写TreeItemonClick():
Android一个RecyclerView实现三级、多级列表(TreeRecyclerView)_第7张图片
2.adapter设置setOnItemClickListener

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

注意.二者冲突


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

传送门:TreeRecyclerView
欢迎Star,哈哈

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

你可能感兴趣的:(学安卓写博客,Android博客)