RecyclerView的行项目视图隐藏/显示在Recyclerview的滚动上搞砸了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView的行项目视图隐藏/显示在Recyclerview的滚动上搞砸了相关的知识,希望对你有一定的参考价值。

我使用RecyclerView在我的应用程序中显示产品列表,我需要根据过道对产品进行分组。在列表中首次提取数据时,产品会根据过道正确分组。当我们滚动视图时,会显示错误项目的过道组分隔符,并且一旦onBindViewHolder自动刷新,分隔符将恢复到正确的位置。

MyAdapter.class
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { 
    itemsGrouping(pickItem, pickItemView, holder.adapterPosition)
}

private fun itemsGrouping(pickItem: PickItem, pickItemView: View, adapterPosition: Int) {
//Based on some condition
if(SomeCondition)
    itemDivider(pickItemView,true)
else 
    itemDivider(pickItemView,false)
}

private fun itemDivider(v: View, boolean: Boolean) {
    if(boolean) {
        v.visibility = View.VISIBLE
    } else {
        v.visibility = View.GONE
    }
 }
答案

好吧,您应该知道视图持有者在Rec​​yclerView中被重用,因此尝试确定onBindViewHolder中分隔符的可见性可能不是正确的想法。我建议使用项目装饰器来分隔。这是How to add dividers and spaces between items in RecyclerView?的问题和答案

另一答案

问题是RecyclerView回收以前的视图以提高效率。我猜“SomeCondition”包含来自之前持有者的工件。

所以在

itemsGrouping(pickItem, pickItemView, holder.adapterPosition)

你应该从新绑定的持有者获得pickItem和pickItemView。你应该使用喜欢

pickItemView = holder.findViewById(R.id.pickItemView);

或者考虑使用DataBinding Library

这是一个很好的例子(它在Kotlin中):DataBoundListAdapter

一旦将适配器扩展到DataBoundListAdapter并覆盖bind()方法,就会为每一行执行bind内的所有内容,因此不会得到重复的结果。

注意:请注意“executePendingBindings()”

以上是关于RecyclerView的行项目视图隐藏/显示在Recyclerview的滚动上搞砸了的主要内容,如果未能解决你的问题,请参考以下文章

从 RecyclerView Adapter Android 隐藏和显示多个视图持有者

如何在 RecyclerView 中选择和取消选择项目?如何仅在回收站视图中突出显示所选项目?

如何在RecyclerView中隐藏视图

RecyclerView 的行正在洗牌和改变图片:android

当另一个滚动时如何隐藏recyclerview

如何在 recyclerView 中的两个不同项目之间显示不同的项目?