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

时间:2021-01-03 17:25:38

标签: android kotlin android-recyclerview 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
        }

    }
}

1 个答案:

答案 0 :(得分:0)

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