我使用android.arch.paging.PagedListAdapter <Item, RecyclerView.ViewHolder>
和 Room DB 作为RecyclerView
中显示项目的数据源。
每个项目都有日期日期。我还在override fun onCurrentListChanged(currentList: PagedList<Item>?).
中按此日期将元素分组
通过分为两个带有假位置的列表(项目和日期)进行分组。总计数是总和计数和日期计数。
我的问题是刷新或加载下一个项目时,IndexOutOfBoundsException: Inconsistency detected
中的RecyclerView
。
可能的解决方案:1-拒绝分开物品(不适合我的任务)。 2-提交项目后使用notifyDataSetChanged()
(但消失的动画并显示为眨眼的更新viewHolders)。
有人可以帮忙吗?
private var fakePositionDates: Map<Int, Date> = emptyMap()
private var fakePositionTaskPositions: Map<Int, Int> = emptyMap()
override fun getItemCount(): Int {
return fakePositionTaskPositions.size + fakePositionDates.size
}
override fun submitList(pagedList: PagedList<Task>?) {
super.submitList(pagedList)
}
override fun onCurrentListChanged(currentList: PagedList<Task>?) {
val groupTasksPositions = currentList?.asIterable()
?.mapIndexed { index, task ->
Pair(index, task.publishDate)
}
?.groupBy { it.second }
?.mapValues {
it.value.map { it.first }
}
?.toSortedMap(Comparator { o1, o2 ->
o2.compareTo(o1)
})
?: sortedMapOf()
val fakePositionDates = mutableMapOf<Int, Date>()
val fakePositionTaskPositions = mutableMapOf<Int, Int>()
var fakePosition = 0
groupTasksPositions.forEach { date, realPositions ->
fakePositionDates[fakePosition] = date
fakePosition += 1
realPositions.forEach {
fakePositionTaskPositions[fakePosition] = it
fakePosition += 1
}
}
this.fakePositionTaskPositions = fakePositionTaskPositions
this.fakePositionDates = fakePositionDates
}
答案 0 :(得分:0)
在调用视图模型函数刷新recyclerview之前,尝试在活动或片段中添加adapter.submitList(null)
和adapter.notifyDataSetChanged