使用 ListAdapter 时,ItemDecoration 仅在重启后应用 activity

ItemDecoration applies only after restart activity when using ListAdapter

当我使用 RecyclerView 时,ItemDecoration 工作得很好。现在,在移动到 ListAdapter 之后,我的项目装饰仅在重新创建 activity 后出现。其实,我明白为什么会这样。当我使用 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的通病。所以,我的问题和描述的一样 and here 仅当 ListAdapter 的所有元素都可见时才帮助我解决了该错误。如果元素多于屏幕放不下,错误再次出现(有点不同,但仍然与装饰有关)。所以,对我来说唯一的方法是降级到 RecyclerView + 使用 notifyDataSetChanged()。这是不好的做法,但无论如何。