我有一个回收站视图。我想将标题添加到回收站视图,以便它与回收站视图一起滚动。几年前,有以下两种选择:
NestedScrollView
内嵌套回收器视图和标头布局。不利的一面是,这意味着回收者视图的行为将不符合预期。2020年我们在哪里?这些仍然是两个选择吗?如果是这样,#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
下面添加某项,则可以在RecyclerView
和LinearLayout
中同时添加NestedScrollView
和另一个{。在添加和删除项目时会有动画,该视图将不会被动画化,必须加以考虑。
#2第二个选项会生成更多代码,并且更复杂,但可以使您流畅地制作动画。
考虑到所有问题,如果您想快速又轻松地进行操作,我建议第一种选择(如果它只是RecyclerView
顶部的一个标头,动画也应该没有问题。