在 Recyclerview 中使用 getItemCount 和 ListAdapter
Posted
技术标签:
【中文标题】在 Recyclerview 中使用 getItemCount 和 ListAdapter【英文标题】:Using getItemCount with ListAdapter in Recyclerview 【发布时间】:2021-11-20 06:29:55 【问题描述】:我正在尝试做一些非常简单的事情:
在 recyclerview 中只显示一定数量的项目(比如说 5 个)。
正如我们所知,使用 ListAdapter 和 DiffUtil,您不需要重写 getItemCount() 方法。
但我需要显示固定数量的项目,所以我确实重写了该方法。
class AllNewsAdapter : ListAdapter<Article, AllNewsAdapter.AllNewsViewHolder>(AllNewsDiffCallback())
var list: List<Article> = listOf()
private val limit = 5
override fun getItemCount(): Int
return if (list.size > limit)
limit
else
list.size
使用它,recyclerview 中不会显示任何项目。
但是当我删除整个 getItemCount() 方法时,所有项目都会显示出来,这是我不想要的
哦!,我也尝试过使用:
return Math.min(list.size(), 5)
但没有运气(没有显示任何项目)。
在使用 RecyclerView.Adapter 时,我可以做到这一点,但它不适用于 ListAdapter
【问题讨论】:
您正在“与框架作斗争”。要么使用常规适配器(并像 ListAdapter 那样在内部提供/使用 DIffUtil),要么转换数据(源)并且只将 5 个项目传递给 adapter.submitList()。这似乎是一个数据转换问题,而不是回收器视图的适配器问题。以我有限的经验,尝试破解 RV 的工作方式通常会导致意想不到的结果(不是我“反对它”,而是我的经验)。 同意@MartinMarconcini,为什么还要将所有不必要的数据传递给适配器?过滤数据,将其传递给适配器并通知它有关更改。这应该是最安全的方式。 【参考方案1】:将此添加到您的适配器:
override fun submitList(list: MutableList<Article>?)
// replace 5 with any number you want
if(list?.size?:0>5) super.submitList(list?.take(5))
else super.submitList(list)
【讨论】:
以上是关于在 Recyclerview 中使用 getItemCount 和 ListAdapter的主要内容,如果未能解决你的问题,请参考以下文章
GetIT 2020 Big List with 81 downloads directly from Embarcadero