【问题标题】:RecyclerView's row item views hide/show getting messed up on scroll of the RecyclerviewRecyclerView 行项目视图隐藏/显示在 Recyclerview 滚动时变得混乱
【发布时间】:2019-03-05 08:41:04
【问题描述】:

我正在使用 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
    }
 }

【问题讨论】:

    标签: android android-layout android-recyclerview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      所以在

      itemsGrouping(pickItem, pickItemView, holder.adapterPosition)
      

      你应该从新绑定的持有者那里得到pickItem和pickItemView。你应该使用像

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

      或者考虑使用DataBinding Library

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

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

      注意:注意“executePendingBindings()”

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 2019-11-09
        • 2016-06-11
        • 1970-01-01
        • 2016-06-17
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多