ItemDecoration 仅在使用 ListAdapter 时重新启动活动后才适用

问题描述

当我使用 RecyclerView 时,Itemdecoration 工作得很好。目前,在移动到 listadapter 后,我的项目装饰仅在重新创建活动后出现。其实,我明白为什么会这样。当我使用 RecyclerView 时,我使用了 notifyDataSetChanged() 来更新我的列表。现在我只是使用内部 submitList,它使用方法只更新一个项目(而不是整个数据集)。但是我现在该怎么办?降级到 RecyclerView 及其 notifyDataSetChanged()?还有其他决定吗?

更新。 当我使用 StaggeredGridLayoutManager(2,VERTICAL) 时出现我的问题。当我只使用 linearlayoutmanager 时,问题就消失了,但我需要它们(布局管理器)。 我的物品装饰:

class SpacesItemdecoration(private var space: Int,private var type: String = "main_grid") : RecyclerView.Itemdecoration() {
    override fun getItemOffsets(outRect: Rect,view: View,parent: RecyclerView,state: RecyclerView.State) {
        super.getItemOffsets(outRect,view,parent,state)

        if (type == "main_grid") {
            //grid layout with 2 columns
            val layoutParams = view.layoutParams as StaggeredGridLayoutManager.LayoutParams
            outRect.bottom = space

            if (layoutParams.spanIndex % 2 == 0) {
                outRect.right = space/2
            }
            else {
                outRect.left = space/2
            }
        }
        else if (type == "main_list") {
            //list layout
            outRect.bottom = space
        }

    }
}

解决方法

其实是RecyclerView和ListAdapter的通病。所以,我的问题与 herehere 描述的相同。 This solution 仅在 ListAdapter 的所有元素都可见时帮助我解决了该错误。如果屏幕上的元素过多,错误会再次出现(它有点不同,但仍然带有装饰)。所以,对我来说唯一的方法 - 使用 notifyDataSetChanged() 降级到 RecyclerView +。这是不好的做法,但无论如何。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...