打造RecyclerView的n级列表
先上效果图:
1.该多级列表的优势:
- 支持无限级列表展开
- 基于一个recyclerView实现
- 可以自定义每一级item的样式,定制化更强
2.设计的思路
- 数据结构List,ItemBean类中有变量List,构造整体RecyclerView的数据源
- 因为RecyclerView.Adapter本来就支持多个type的item布局,不清楚的可以看下getItemViewType这个方法,所以我们可以利用这个类,来区分不同级用不同的Item。
- 将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:
......
}
}
}
- 上面的泛型T就是我们的Item的class类型,所以自定义的class要想用这个adapter的话,都需要实现Tree接口
- 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级列表的更多相关文章
- 使用RecyclerView实现的分组列表。
项目介绍: StickyHeaders使用RecyclerView实现的分组列表
- Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例
Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表, ...
- PullToRefreshScrollView 嵌套RecyclerView实现特卖列表倒计时抢购
不久之前,我们谈到了通过Handler与timer及TimerTask结合实现倒计时抢购列表,那个是PullToRefreshListView实现的,今天要讲的是PullToRefreshScroll ...
- Android基于RecyclerView实现高亮搜索列表
这篇应该是RecycleView的第四篇了,RecycleView真是新生代的宠儿能做这么多的事情. 转载请注明作者AndroidMsky及原文链接 http://blog.csdn.net/Andr ...
- android中RecyclerView控件的列表项横向排列
本文是在上一篇文章的基础上做的修改:android中RecyclerView控件的使用 1.修改列表项news_item.xml:我这里是把新闻标题挪到了新闻图片的下面显示 <?xml vers ...
- 修改文档框架:word-多级列表与标题样式相结合
转自:http://blog.sina.com.cn/s/blog_6721f25c0100nuf0.html 设置标题的时候希望出现多标题并且自动编号的标题,如下1. XXXXXXXXXXX ...
- li下的ul----多级列表
<ul id="ul_Style1"> <li>第1级第1行</li> <li> <ul id="ul_Style2 ...
- 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...
- 5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)
使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...
随机推荐
- 网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...
- HTML入门5
格式化文本,高阶处理,接下来了解,标记引文,描述列表,计算机代码和其他文本,上下标,联系信息等数据. 学习不太知名的HTML元素来标记高级语义特征. 描述列表,也叫自定义列表,第三种类型的列表,除了u ...
- AngularJS_简介、特性及基本使用_及其工作原理
转自:angularJS 的工作原理 转自:通过<script>标签引入到 HTML 中,那么此时 Angular 就做为一个普通的 DOM 节点等待浏览器解析 当浏览器解析到这个节点时, ...
- react_app 项目开发 (4)_ React UI 组件库 ant-design 的基本使用
最流行的开源 React UI 组件库 material-ui 国外流行(安卓手机的界面效果)文档 ant-design 国内流行 (蚂蚁金服 设计,一套 PC.一套移动端的____下拉菜单.分页.. ...
- Android常用的工具类SharedPreferences封装类SPUtils
package com.zhy.utils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect. ...
- day27、28 二十八、项目:选课系统
选课系统 作业要求 角色:学校.学生.课程.讲师 要求: 1. 创建北京.上海 2 所学校 ----> 创建学校 2. 创建linux , python , go 3个课程 , linux\py ...
- .NET Core 中基于 IHostedService 实现后台定时任务
.NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Core 2.1 则锦上添花地提供了 IHostedService 的默认实现基类 Bac ...
- delphi调用windows自带语音功能
windows自带语音接口 SAPI.SpVoice, 接口说明如下 https://docs.microsoft.com/en-us/previous-versions/windows/deskto ...
- 音频 m4a 转 wav
背景 最近做智能家居,需要用到一些应答词 需要自己录制.但是在mac下面通过 QuickTime 录制的是 m4a格式.但是应答词需要 wav格式.所以就需要转化了 解决方法 # sox 不行, ff ...
- css3工具
随着CSS3的出现,CSS3讨论的话题越来越多了,现在各种教程也是多如牛毛,不比一年前的时候,找个资料要捞遍整个互联网,而且还很难找到自己需要的参考资料.从侧面也说明,CSS3对于前端工程师来说,越来 ...