先上效果图:

1.该多级列表的优势:

  1. 支持无限级列表展开
  2. 基于一个recyclerView实现
  3. 可以自定义每一级item的样式,定制化更强

2.设计的思路

  1. 数据结构List,ItemBean类中有变量List,构造整体RecyclerView的数据源
  2. 因为RecyclerView.Adapter本来就支持多个type的item布局,不清楚的可以看下getItemViewType这个方法,所以我们可以利用这个类,来区分不同级用不同的Item。
  3. 将Item必须具备的方法放在一个Tree接口里面,以后自定义的类只需要继承Tree接口就好了。

3.代码分析

public abstract class BaseTreeRVAdapter<T extends RecyclerView.ViewHolder, M extends Tree> extends BaseRVAdapterV2<T, M> {

    @Override
public void onBindViewHolder(T holder, final int position) {
try {
getLevel(position, mDatas, new PosBean());
} catch (StopMsgException ex) {
int type = Integer.parseInt(ex.getMessage());
M tree = ex.getTree();
onBindViewHolder(type, tree, holder);
}
} @Override
public int getItemViewType(int position) {
try {
getLevel(position, mDatas, new PosBean());
} catch (StopMsgException ex) {
return Integer.parseInt(ex.getMessage());
}
return 0;
} @Override
public int getItemCount() {
return getTotal(mDatas);
} protected abstract void onBindViewHolder(int type, M tree, T holder); public List<M> getDatas() {
return mDatas;
} public void setDatas(List<M> info) {
if (info != null) {
mDatas = info;
} else {
mDatas.clear();
}
notifyDataSetChanged();
}
}

注释1:主要是计算当前给的数据他的item个数,会根据是否展开的状态来统总个数

注释2:计算当前的postion对应的item层级,来显示对应的item布局

4.对于自己需要实现的地方

public class TreeListAdapter extends BaseTreeRVAdapter<RecyclerView.ViewHolder, T extends Tree> {

    @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
RecyclerView.ViewHolder vh;
switch (viewType) {
case 0:
......
break;
case 1:
......
break;
case 2:
......
break;
case 3:
case 4:
......
}
return vh;
} @Override
protected void onBindViewHolder(int type, final DiscountItem itemCategoryListBean, RecyclerView.ViewHolder holder) {
switch (type) {
case 0:
......
break;
case 1:
......
break;
case 2:
......
break;
case 3:
case 4:
......
}
}
}
  1. 上面的泛型T就是我们的Item的class类型,所以自定义的class要想用这个adapter的话,都需要实现Tree接口
  2. onBindViewHolder方法中形参的的type就是层级,比如说第一级type就是0,第二级是1,以此类推

5.另外自定义的类如果不需要extends的话,那么需要继承wellijohn.org.treerecyclerview.vo.TreeItem,如果已经写了的话,那么就需要自己实现Tree接口。

必须实现的几个方法:

    int getLevel();//每个item的层级,比如一级就是0,二级就返回1,这里的0和1可以自己定义,后面就是根据这个来选择哪种样式的item

    List<T> getChilds();//返回的子列表,比如当前类是一级的话,那么这个方法返回的是二级的列表数据

    boolean isExpand();//是否展开,true展开,false不展开,一般就是点击下去修改这个值刷新adapter,就能达到展开还是折叠的目的了

6.引入方式

step 1.
Add it in your root build.gradle at the end of repositories: allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step 2. Add the dependency dependencies {
implementation 'com.github.WelliJohn:MultiLevelRecyclerView:0.0.1'
}

7.demo示例

多级列表示例,如果觉得有用,还请点个赞。

打造RecyclerView的n级列表的更多相关文章

  1. 使用RecyclerView实现的分组列表。

    项目介绍: StickyHeaders使用RecyclerView实现的分组列表

  2. Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例

    Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表, ...

  3. PullToRefreshScrollView 嵌套RecyclerView实现特卖列表倒计时抢购

    不久之前,我们谈到了通过Handler与timer及TimerTask结合实现倒计时抢购列表,那个是PullToRefreshListView实现的,今天要讲的是PullToRefreshScroll ...

  4. Android基于RecyclerView实现高亮搜索列表

    这篇应该是RecycleView的第四篇了,RecycleView真是新生代的宠儿能做这么多的事情. 转载请注明作者AndroidMsky及原文链接 http://blog.csdn.net/Andr ...

  5. android中RecyclerView控件的列表项横向排列

    本文是在上一篇文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml:我这里是把新闻标题挪到了新闻图片的下面显示 <?xml vers ...

  6. 修改文档框架:word-多级列表与标题样式相结合

    转自:http://blog.sina.com.cn/s/blog_6721f25c0100nuf0.html 设置标题的时候希望出现多标题并且自动编号的标题,如下1.     XXXXXXXXXXX ...

  7. li下的ul----多级列表

    <ul id="ul_Style1"> <li>第1级第1行</li> <li> <ul id="ul_Style2 ...

  8. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...

  9. 5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)

    使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...

随机推荐

  1. django——web框架简介

    1.web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件. 应用程序有两种模式C/S.B/S.C/S是客户 ...

  2. Python: 你不知道的 super

    https://segmentfault.com/a/1190000007426467 Python: 你不知道的 super 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我 ...

  3. 20175324 《Java程序设计》第3周学习总结

    # 学号 20175324 <Java程序设计>第3周学习总结 ## 教材学习内容总结 在蓝墨云中的教程里学习了如何安装IDEA,并且尝试了自己破解IDEA,主要在看书时,对java中的类 ...

  4. 经过N条边的最短路

    http://acm.pku.edu.cn/JudgeOnline/problem?id=3613 求经过N条边的最短路 (2 ≤ N ≤ 1,000,000) 倍增floyd,主体是矩阵乘法.考虑一 ...

  5. 外网访问VMware虚拟机

      目的: 主机上安装了VMware,VMware上安装了Linux虚拟机(我安装的是Centos7).我想让虚拟机向外提供Web服务.本文记录如何让我的主机和外网用户可以访问VM虚拟机上的Web. ...

  6. robotframe中使用report,设置路径带有时间戳

    1.打开C:\Python27\Lib\site-packages\robotide\contrib\testrunner,找到testrunner.py.   修改代码块def _create_te ...

  7. ldap/sldap

    给新建的账户赋权限也是通过修改配置文件/etc/openldap/slapd.conf来实现,具体的增加的内容如下: 如上面示例中就定义了两个用户,一个是只读用户cn=bbs,dc=361way,dc ...

  8. python learning day01

    python简介 一.python的由来: python的创始人是吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚 ...

  9. Exp2 后门原理与实践 20164320 王浩

    一.实践基本内容 1.实践目标 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter(或其他 ...

  10. python函数把可变数据类型当默认参数值的问题(转)

    add by zhj: 文章写的很好,其实只要默认参数在函数中只读不写,那默认值就不会被修改,可变类型做默认参数就不会有问题 方法二中,当result is None时,修改result的指向,不再指 ...