在 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

getit

python getit sploit

GetIT 2020 Big List with 81 downloads directly from Embarcadero

无法在字段初始化程序中访问此内容以读取“属性”

RecyclerView | 在 RecyclerView 中使用 ListAdapter