【问题标题】:How to use a RecyclerView inside NestedScrollView such that only visible items are loaded如何在 NestedScrollView 中使用 RecyclerView 以便仅加载可见项目
【发布时间】:2021-02-26 19:52:51
【问题描述】:

预期的布局应为单个项目的网格布局,这些项目由水平分隔线和标题分成多个部分。 (人们可能会想到 Google Photos 的画廊视图。)整个布局应该是可滚动的。下图说明了一个模型。

在左侧可以看到整个(虚拟)布局。在右边,一看到就可以看到可见的视口。

粗略一看,布局的当前 XML 结构如下所示:

androidx.core.widget.NestedScrollView
  |
  +-- LinearLayout
        |
        +-- TextView     (the first caption)
        +-- androidx.recyclerview.widget.RecyclerView
        +-- View         (the divider)
        +-- TextView     (the second caption)
        +-- androidx.recyclerview.widget.RecyclerView

RecyclerView 的高度设置为wrap_contentsetNestedScrollingEnabled( false ) 被称为推荐by this answer

问题:虽然布局按预期工作,但效率低下。 ReyclerView 为整个画廊中的每个项目实例化一个独立对象RecyclerView.ViewHolder,而不仅仅是可见项目。在示例中:60 个对象而不是只有 26 个。换句话说,ReyclerView 不回收任何东西。此外,onBindViewHolder 在创建视图期间也被调用了 60 次,这意味着我最终必须一次加载所有数据。 (当模型图标将被真实图像替换时。)

背景:当然,我了解问题的原因。从RecyclerView 的角度来看,一切都立即可见。 RecyclerView 不知道是嵌入在 NestedScrollView 中,它会剪掉不可见的部分。

问题:我如何实现预期的布局并从RecyclerView 的优势(视图回收、数据的延迟/分页加载)中受益?也许,使用RecyclerView 是错误的方法,我需要使用完全不同的东西。

【问题讨论】:

  • 我认为你可以通过一个RecyclerView 实现你想要的一切。使用getItemViewType() 绘制标题和分隔线,使用SpanSizeLookup 使它们跨越视口的整个宽度。

标签: android android-layout android-recyclerview android-nestedscrollview


【解决方案1】:

NestedScrollView 绘制所有子元素,这就是你失去使用 RecyclerView 的所有优势的原因。如果你想改进这一点,你应该为你的 recyclerView 使用一个 Header (The TextView) 和一个 Footer (Divider) 并避免使用 NestedScrollView。查看此示例Header/Footer in RecyclerView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多