【发布时间】: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_content,setNestedScrollingEnabled( 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