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