Android.轻松将层级复杂的数据展示在ListView/Re
2017.2.22更新:现在有更好的实现方式,请看这篇文章:Android.轻松地将嵌套的数据展示在ListView和RecyclerView中(2)
它的实现方式依赖于此篇文章介绍的数据结构,感兴趣的可以继续看这篇文章,但内容比较雷同,建议侧重上面介绍的文章。
——————————————————————————————————————————————
以下为过去发表的内容⬇️⬇️⬇️
大家都知道ListView和RecyclerView(为了简便,以下都用ListView表示)都能用来展示一列数据。但是如果数据比较复杂,比如qq的好友列表,是分组展示的,每一组里又显示一列好友,所以qq好友列表数据的层级是2,外层是分组,内层是好友。这种层级为2的数据可以用ExpandableListView来展示,刚好ExpandableListView还可以收缩和展开。但是,ExpandableListView有其局限性,一是和ListView差别较大,两者重构起来比较麻烦。二是ExpandableListView只能展示两层,遇到层级更复杂的数据,就不太适用了。
我们经常需要将层级复杂的数据展示到ListView中,抛开ExpandableListView,通常的做法是层层遍历,按按顺序将数据添加到列表或者数组中,这样,层级结构的数据就被展平了,可以方便地显示在ListView中。这是非常直观的做法,但仍有局限性。一是展平后的数据和原始数据失去了关联,如果单纯的展示数据还好,如果需要操作数据,比如,qq好友列表的例子中,要将某组好友中的某个好友在该组中置顶,或者展开(收缩)某一组好友,操作起来就比较麻烦;二是展示复杂数据的场景太多了,经常为特定的场景写类似的代码很麻烦,而且数据不同,写法也不一样,每次都要为类似的事情重新构思,是不是很烦?
所以,就需要一套框架,来将层级复杂的数据映射到列表中。其实,这种分层级的数据就是树状数据。而我的想法也很简单,就是能不能有一种树,它自带索引,这个索引能按以上提到的列表的顺序访问这颗树的节点。而我们需要做的仅是构造和我们的数据的层级结构相同的树,并把数据填到树的对应的节点中,然后用索引来访问树并展示数据。这样,无论数据的层级如何,操作都很相似,并且,保留了数据的结构。
以下谈谈简要的实现方式:
用一个Node类表示树节点,用来构造树,Node类需要维护一个int类型的数量,表示这个节点包含的子节点数(包括子节点的子节点的子节点..,也就是节点展平后的数量),这样,就能方便地在索引中添加和删除节点的引用了(因为在索引中添加和删除节点需要同时处理其子节点)。
具体的实现可以看源代码,注释比较详细。实现了一些有用的功能,比如展开,收缩和隐藏节点,因此可以在ListView中的任意地方收缩和展开,比ExpandableListView强大。代码持续完善中。
贴出一张用这个框架实现的demo的效果图:
![](https://img.haomeiwen.com/i2480008/b99790ec7222baa0.gif)
框架源代码:https://github.com/jack-cook/LinearTree
demo代码:https://github.com/jack-cook/HierarchicalViewSample