【问题标题】:Header in recycler view, what is the best practice in 2020? [closed]回收者视图中的标头,2020 年的最佳实践是什么? [关闭]
【发布时间】:2021-01-20 18:19:48
【问题描述】:

我有一个回收者的观点。我想在回收器视图中添加一个标题,以便它与回收器视图一起滚动。多年前,选择是:

  1. 将回收站视图和标题布局嵌套在NestedScrollView 中。这样做的不利之处在于,这意味着回收站视图不会按预期运行。
  2. 修改回收器视图,使其处理两种视图类型,一种用于标题,另一种用于常规回收器视图项。

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

谢谢。

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:
    • 如果您想在RecyclerView 中显示长列表,则绝对不要使用选项 1。将RecyclerView 放入NestedScrollView 将强制RecyclerView 一次创建所有项目。您将失去回收,并且您的应用程序可能会冻结以尝试创建所有 ViewHolders。它也会吃掉很多内存。 read more

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

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

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

    截至 2020 年 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 开始被大量使用,并被证明是多类型列表的最佳解决方案。

    【讨论】:

      【解决方案2】:

      我最近遇到了同样的问题,经过研究,我没有找到其他选择。两者都很好,各有优缺点。

      #1 第一个肯定更容易,如果你想要一个标题(不像下面的东西)它不应该有任何问题,滚动应该没问题,动画也应该。 (如果您想在RecyclerView 下方添加某个东西,您可以在LinearLayoutNestedScrollView 中添加RecyclerView 和另一个。它会正常工作,但是如果在添加项目时有动画并删除,视图将不会被动画化,必须考虑到这一点。

      #2 第二个选项会生成更多代码并且更复杂,但它可以为您提供流畅的动画。

      考虑到所有因素,如果您想快速轻松地进行某事,我会建议第一个选项(如果它只是 RecyclerView 顶部的一个标题,那么动画也应该没有问题。

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多