代码之家  ›  专栏  ›  技术社区  ›  Manoj Kumar

android recyclerview的行项目视图在recyclerview的滚动条上隐藏/显示出错

  •  0
  • Manoj Kumar  · 技术社区  · 6 年前

    我正在使用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
        }
     }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   RexSplode    6 年前

    好吧,您应该知道视图持有者是在recyclerview中重用的,所以尝试确定onbindviewholder中分隔符的可见性可能不是正确的想法。我建议在分隔器中使用item decorator。这是问题和答案 How to add dividers and spaces between items in RecyclerView?

        2
  •  0
  •   Ali Korkmaz    6 年前

    问题是recyclerview回收以前的视图以提高效率。 我猜“somecondition”包含了以前持有者的文物。

    所以

    itemsGrouping(pickItem, pickItemView, holder.adapterPosition)
    

    您应该从新绑定的持有者处获取pickitem和pickitemview。你应该用like

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

    或者考虑使用 DataBinding Library

    下面是一个很好的例子(在Kotlin): DataBoundListAdapter

    一旦将适配器扩展到databoundListAdapter并重写bind()方法,bind中的每一行都将执行,这样就不会得到重复的结果。

    注意:注意“executePendingBindings()”