在回收者看来,2020年的最佳实践是什么?

时间:2020-10-05 21:02:23

标签: android android-recyclerview

我有一个回收站视图。我想将标题添加到回收站视图,以便它与回收站视图一起滚动。几年前,有以下两种选择:

  1. NestedScrollView内嵌套回收器视图和标头布局。不利的一面是,这意味着回收者视图的行为将不符合预期。
  2. 修改回收者视图,以使其处理两种视图类型,一种用于标题,另一种用于常规回收者视图项。

2020年我们在哪里?这些仍然是两个选择吗?如果是这样,#2仍然是推荐选项吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

  • 如果要在RecyclerView中显示长列表,则永远不要使用选项1。将RecyclerView放在NestedScrollView中将迫使RecyclerView一次创建所有项目。您将丢失回收资源,您的应用可能会冻结,以尝试创建所有ViewHolders。它还会占用大量内存。 read more

  • 选项2是实现列表中具有不同布局类型的主要方法。但这会使创建列表的部分变得更加复杂。至少不适用于Paging library 2

幸运的是,我们现在有了更好的选择。

RecyclerView版本1.2.0-alpha02开始,有一个新工具可用于轻松创建其中包含不同项目的复杂列表。它称为ConcatAdapter。您可以在Florina Muntenescu在Medium上的great article中阅读更多相关内容。

截至20年5月10日,库的最新版本为1.2.0-alpha06。尽管库仍处于alpha版本,ConcatAdapter是一个很棒的工具,自从它首次引入以来我就一直在使用它。到目前为止,我从未遇到任何问题。它运作良好,一切都很稳定。

根据我的经验,我想这可能是RecyclerView中添加页眉和页脚(以及混合类型列表)的新的最佳实践

ConcatAdapter也用在Paging library version 3中。在此codelab中,它们将页眉和页脚本地添加到适配器中。

binding.list.adapter = adapter.withLoadStateHeaderAndFooter(
        header = ReposLoadStateAdapter { adapter.retry() },
        footer = ReposLoadStateAdapter { adapter.retry() }
)

适配器扩展PagingDataAdapter

如果您转到源代码,您将看到withLoadStateHeaderAndFoote在后​​台使用ConcatAdapter

/**
 * Create a [ConcatAdapter] with the provided [LoadStateAdapter]s displaying the
 * [LoadType.PREPEND] and [LoadType.APPEND] [LoadState]s as list items at the start and end
 * respectively.
 *
 * @see LoadStateAdapter
 * @see withLoadStateHeader
 * @see withLoadStateFooter
 */
fun withLoadStateHeaderAndFooter(
    header: LoadStateAdapter<*>,
    footer: LoadStateAdapter<*>
): ConcatAdapter {
    addLoadStateListener { loadStates ->
        header.loadState = loadStates.prepend
        footer.loadState = loadStates.append
    }
    return ConcatAdapter(header, this, footer)
}

所有这些表明ConcatAdapter开始被大量使用,并被证明是多类型列表的最佳解决方案。

答案 1 :(得分:0)

我最近在同一个问题上苦苦挣扎,经过研究,我没有找到其他选择。两者都很好,各有利弊。

#1第一个绝对容易,如果您想要一个标头(与下面的内容不同),应该没有任何问题,滚动应该很好,动画也应该如此。 (如果您想在RecyclerView下面添加某项,则可以在RecyclerViewLinearLayout中同时添加NestedScrollView和另一个{。在添加和删除项目时会有动画,该视图将不会被动画化,必须加以考虑。

#2第二个选项会生成更多代码,并且更复杂,但可以使您流畅地制作动画。

考虑到所有问题,如果您想快速又轻松地进行操作,我建议第一种选择(如果它只是RecyclerView顶部的一个标头,动画也应该没有问题。