在ListView中展示嵌套的数据是非常常见的,比如QQ的好友列表,外部是分组,分组里嵌套着好友列表。这种二级的嵌套数据可以用ExpandableListView展示,但是如果是三级或者更深的嵌套层级,ExpandableListView就不适用了。那么如何实现呢?

通常的做法是自己编写数据结构,将嵌套的数据映射到列表中,再将列表展示到ListView中。但是这样做会让代码依赖于需求,比较难维护,并且不同的场景需要编写不同的实现方式。

ListView的使用方式很简单,程序员告诉ListView要展示的列表的长度及列表各位置的数据。类似地,如果能告诉ListView更多的信息,如列表某个位置的数据嵌套了另一个列表,让ListView去递归地获取更深层次的信息并展示就好了。然而ListView并不具有这样的功能。不过别担心,我们可以扩展ListView的Adapter,让Adapter具备这样的能力,这样,只要需要展现嵌套的数据,使用这样的Adapter就可以了,无需烦恼数据结构到列表的映射。

那么如何实现这样的Adapter呢?Adapter需要提供接口,让程序员告诉它数据的层级关系,然后内部维护一个列表代表对嵌套数据的映射。ListView真正使用的是这个内部列表,我们只是扩展了Adapter让其更懂我们数据的结构。

以下是这种Adapter的一种具体实现的代码,适用于ListView和RecyclerView。

值得一提的是,这种实现同时具有展开和收缩节点的功能,不限于节点的层级,只需要动态地告诉Adapter某一节点的列表长度为真实长度或者欺骗它,告诉它长度为0.

PreOrderTreeAdapter内部映射数据到列表的实现方式在我的另外一篇文章中有介绍:www.jianshu.com/p/6e0d76dc16fa

跟这篇文章比较相似,没有必要再看,感兴趣可以直接看其代码实现:LinearTree

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐