多ItemType完成多级谈论页面

前言

我的上一篇文章 Android简略的两级谈论功用完成,得到了许多的谈论(万万没想到),收获了jym们名贵的建议和指导,在此特别感谢我们。

在上一篇文章中,关于‘两级谈论功用’的完成,我采用的是Recycler嵌套的办法,这种办法的完成不难,但是十分的费事,有许多不必要的操作,扩展性很差,维护起来也是十分凌乱。尽管终究完成作用还能够,但是有更好更便利的办法,何乐而不为呢。所以这篇文章的内容便是对多ItemType完成谈论功用的进程阐述,还有两种完成办法的差异和功用差异。

:文章要参加更文活动,只会粘贴关键的代码。如需具体代码,请私信。

一、适配器

重复的部分就不说了,数据库和布局部分根本和上一篇是共同的,只是把item布局中的RecyclerView和对应的适配器及相关代码去掉了。

1、创立两个ViewHolder

分别是TestOneViewHolder和TestTwoViewHolder,这儿不贴代码只展现布局了

一级谈论的布局:

RecyclerView+多ItemType实现两级评论页面

二级谈论的布局:

RecyclerView+多ItemType实现两级评论页面

2、设置两个ItemType

LEVEL_ONE_VIEW一级谈论的ViewType,LEVEL_TWO_VIEW二级谈论的ViewType

private val LEVEL_ONE_VIEW = 0 // 一级布局的的ViewType
private val LEVEL_TWO_VIEW = 1 // 二级布局的的ViewType

3、办法重写

  • getItemViewType办法中回来ViewType
override fun getItemViewType(position: Int): Int {
    val commentInfo = list.toList()[position].first
    return if (commentInfo.level == 1) {
        LEVEL_ONE_VIEW
    } else {
        LEVEL_TWO_VIEW
    }
}

这儿list的类型是‘Map<CommentInfo, User>’,是由于还需要User的数据,所以映射来的。 获取到谈论信息后对level进行判断,回来相应的ViewType。

  • onCreateViewHolder中依据ViewType进行判断,依据TYPE回来相应的ViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return if (viewType == LEVEL_ONE_VIEW) {
        TestOneViewHolder(parent)
    } else {
        TestTwoViewHolder(parent)
    }
}
  • onBindViewHolder通过getItemViewType(position)来获取当前的ViewType,再进行数据绑定。如图:
RecyclerView+多ItemType实现两级评论页面

4、数据绑定

在ViewHolder中将传入的数据对布局进行赋值就好了,终究完成的作用如下图。为了能够更加直观的看出一级谈论与二级谈论之间的相关,图片中的谈论内容用数字进行标识。

RecyclerView+多ItemType实现两级评论页面

能够看到在设置完多ItemType后,显现的布局符合我们的预期了,但是一级谈论和二级谈论之间毫无相关,各过各的,那怎么将谈论布局展现出绑定的作用呢?主要仍是对数据进行处理啦,怎么处理呢,请看下一节。

二、绑定

这个绑定指的是将与一级谈论相相关的二级谈论和该一级谈论展现在一起,有一种类似的绑定作用。大致思路如下:

  1. 获取该文章的一切谈论
  2. 分别获取到level为1、2的谈论列表
  3. 将level为2的列表按照回复谈论的Id进行分组
  4. 创立空列表
  5. 遍历level为1的列表,获取到相应的level2的列表并顺次添加进空列表

完成代码如下:

// 获取该文章的一切谈论
val comments = commentStoreRepository.getCommentsByNewId(newsId)
// 获取level为1、2的谈论、按时刻进行排序
val level1 = comments.filter { it.level == 1 }.sortedBy { it.time }
val level2 = comments.filter { it.level == 2 }.sortedBy { it.time }
// 将level为2的列表按照回复谈论的Id进行分组
val level2Group = level2.groupBy { it.replyId }
// 创立空列表
val list = mutableListOf<CommentInfo>()
// 遍历level1的列表 获取到对应的level2列表 顺次添加进空列表中
level1.forEach { level1Info ->
    val newLevel2Group = level2Group[level1Info.id]
    list.add(level1Info)
    if (newLevel2Group != null) {
        list.addAll(newLevel2Group)
    }
}

这个空列表,即list便是我们需要的能展现强绑定联系的列表啦

终究呈现的作用如下图

RecyclerView+多ItemType实现两级评论页面

这样,一个多ItemType的二级谈论展现就完成啦!!!

三、两种完成办法比对

  1. 完成1 – 嵌套RecyclerView的完成
  2. 完成2 – 多ItemView的完成

1、凌乱程度:

片面方面来说,

  • 完成1 — 首先是在数据及布局的处理方面,会显得十分凌乱。我在十分了解其数据结构的情况下,许多时分也摸不着头脑,并且代码不便利办理。再便是扩展性,如果在这个完成的基础上进行扩展会十分的凌乱,想着要是做个更多层级的谈论那得多费事。长处便是能够对二级谈论进行单独的办理。
  • 完成2 — 单独对布局进行办理,很便利,凌乱程度低,扩展性也更好,用来做个多级谈论不成问题。缺点:我想完成一个谈论下的二级谈论最多展现两条,能够打开,还能够显现回复条数的功用不知道怎么做,完成一由于能够对二级数据统一办理就会比较好完成。这一点,如果有大佬知道怎么解决,请在谈论下热情宣布你的言论。

RecyclerView+多ItemType实现两级评论页面

2、功用方面:

分别刺进100100010000条数据,记录耗费时刻。如图所示,统计的次数较少,但也能够看出二者在功用方面的差异不大。

结论两种完成功用差异较小。

RecyclerView+多ItemType实现两级评论页面

四、结语

以上,便是多个ItemType完成二级谈论的进程和结果以及两种完成办法的片面对比。文章若呈现过错,欢迎各位批评指正,写文不易,转载请注明出处谢谢。