RecyclerView:通过PagedListAdapter更新分组的项目时检测到不一致

时间:2018-08-09 11:52:29

标签: android android-recyclerview indexoutofboundsexception

我使用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
}

1 个答案:

答案 0 :(得分:0)

在调用视图模型函数刷新recyclerview之前,尝试在活动或片段中添加adapter.submitList(null)adapter.notifyDataSetChanged