Android 数据不可用时使用DiffUtil';t从索引0开始

Android 数据不可用时使用DiffUtil';t从索引0开始,android,androidx,android-diffutils,Android,Androidx,Android Diffutils,我的回收视图中的项目结构如下: Index | Item 0. Header Item 1. 0. Data 2. 1. Data 3. 2. Data 4. 3. Data [....] 我的数据库自动向RecyclerView发送更新。 使用DiffUtil时,我会删除索引3处的项。在我的数据库项目中,索引为2。正在由DiffUitl Dispatcher删除。我认为这是因为DiffUtil dispatcher不知道我的项被一个索引“偏

我的回收视图中的项目结构如下:

Index | Item
0.      Header Item
1.      0. Data 
2.      1. Data
3.      2. Data
4.      3. Data
[....]
我的数据库自动向RecyclerView发送更新。
使用DiffUtil时,我会删除索引3处的项。在我的数据库项目中,索引为2。正在由DiffUitl Dispatcher删除。我认为这是因为DiffUtil dispatcher不知道我的项被一个索引“偏移”。如何修复此问题?

您可以尝试使用DiffUtil.DiffResult.dispatchUpdatesTo(ListUpdateCallback),实现自定义ListUpdateCallback

例如:

private class CustomListUpdateCallback(val adapter: RecyclerView.Adapter<*>) : ListUpdateCallback {
    override fun onChanged(position: Int, count: Int, payload: Any?) {
        adapter.notifyItemRangeChanged(position + 1, count, payload)
    }

    override fun onMoved(fromPosition: Int, toPosition: Int) {
        adapter.notifyItemMoved(fromPosition + 1, toPosition + 1)
    }

    override fun onInserted(position: Int, count: Int) {
        adapter.notifyItemRangeInserted(position + 1, count)
    }

    override fun onRemoved(position: Int, count: Int) {
        adapter.notifyItemRangeRemoved(position + 1, count)
    }
}
私有类CustomListUpdateCallback(val适配器:RecyclerView.adapter):ListUpdateCallback{
更改后覆盖乐趣(位置:Int,计数:Int,有效负载:Any?){
适配器。NotifyItemRange已更改(位置+1,计数,有效负载)
}
移动时覆盖乐趣(fromPosition:Int,toPosition:Int){
适配器。notifyItemMoved(从位置+1,位置+1)
}
覆盖未插入(位置:Int,计数:Int){
adapter.notifyItemRangeInserted(位置+1,计数)
}
已移除覆盖(位置:Int,计数:Int){
适配器。NotifyItemRange已删除(位置+1,计数)
}
}

您可以尝试使用DiffUtil.DiffResult.dispatchUpdatesTo(ListUpdateCallback),实现自定义ListUpdateCallback

例如:

private class CustomListUpdateCallback(val adapter: RecyclerView.Adapter<*>) : ListUpdateCallback {
    override fun onChanged(position: Int, count: Int, payload: Any?) {
        adapter.notifyItemRangeChanged(position + 1, count, payload)
    }

    override fun onMoved(fromPosition: Int, toPosition: Int) {
        adapter.notifyItemMoved(fromPosition + 1, toPosition + 1)
    }

    override fun onInserted(position: Int, count: Int) {
        adapter.notifyItemRangeInserted(position + 1, count)
    }

    override fun onRemoved(position: Int, count: Int) {
        adapter.notifyItemRangeRemoved(position + 1, count)
    }
}
私有类CustomListUpdateCallback(val适配器:RecyclerView.adapter):ListUpdateCallback{
更改后覆盖乐趣(位置:Int,计数:Int,有效负载:Any?){
适配器。NotifyItemRange已更改(位置+1,计数,有效负载)
}
移动时覆盖乐趣(fromPosition:Int,toPosition:Int){
适配器。notifyItemMoved(从位置+1,位置+1)
}
覆盖未插入(位置:Int,计数:Int){
adapter.notifyItemRangeInserted(位置+1,计数)
}
已移除覆盖(位置:Int,计数:Int){
适配器。NotifyItemRange已删除(位置+1,计数)
}
}

您不应该依赖数据库行和
RecyclerView
位置相同。我建议为每个
数据
项保留一个数据库id,并根据该id删除,而不是根据
RecyclerView
适配器位置删除。数据是根据id删除的。我的问题是diffutil不知道我添加了一个将所有数据项向下移动一个的标题项。为什么不呢?您可以对多个项目类型使用DiffUtil,并基于项目类型和内容使用diff。这是一个好主意。谢谢,您不应该依赖数据库行和
RecyclerView
位置相同。我建议为每个
数据
项保留一个数据库id,并根据该id删除,而不是根据
RecyclerView
适配器位置删除。数据是根据id删除的。我的问题是diffutil不知道我添加了一个将所有数据项向下移动一个的标题项。为什么不呢?您可以对多个项目类型使用DiffUtil,并基于项目类型和内容使用diff。这是一个好主意。谢谢你能给你的答案加一个例子吗?我已经加了一个例子。你能给你的答案加一个例子吗?我已经加了一个例子