Android-ViewPager2在调用Diffutil.dispatchUpdatesTo时将适配器位置重置为0

Android-ViewPager2在调用Diffutil.dispatchUpdatesTo时将适配器位置重置为0,android,android-jetpack,android-viewpager2,android-diffutils,Android,Android Jetpack,Android Viewpager2,Android Diffutils,我有一个ViewPager2,它被设置为水平滑动。我的想法是建立一个无限滚动寻呼机。这个类看起来像这样: inner class ContentIdsDiffCallback(private val oldItems: List<Int>, private val newItems: List<Int>) : DiffUtil.Callback() { override fun getOldListSize(): Int { return oldI

我有一个ViewPager2,它被设置为水平滑动。我的想法是建立一个无限滚动寻呼机。这个类看起来像这样:

inner class ContentIdsDiffCallback(private val oldItems: List<Int>, private val newItems: List<Int>) : DiffUtil.Callback() {
    override fun getOldListSize(): Int {
        return oldItems.size
    }

    override fun getNewListSize(): Int {
        return newItems.size
    }

    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return oldItems[oldItemPosition] == newItems[newItemPosition]
    }

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return areItemsTheSame(oldItemPosition, newItemPosition)
    }
}
class SwipeAdapter(fragmentActivity:fragmentActivity):FragmentStateAdapter(fragmentActivity)

我已经覆盖了通常的
createFragment(位置:Int):Fragment
,在这里我将返回一个新片段


我有一个正在操作的ID列表,它是适配器数据集

private var contentIds=mutableListOf()

我还实施了

override fun containsItem(itemId: Long): Boolean {
    return contentIds.contains(itemId.toInt())
}

override fun getItemId(position: Int): Long {
    return contentIds[position].toLong()
}

我的DiffUtil如下所示:

inner class ContentIdsDiffCallback(private val oldItems: List<Int>, private val newItems: List<Int>) : DiffUtil.Callback() {
    override fun getOldListSize(): Int {
        return oldItems.size
    }

    override fun getNewListSize(): Int {
        return newItems.size
    }

    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return oldItems[oldItemPosition] == newItems[newItemPosition]
    }

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return areItemsTheSame(oldItemPosition, newItemPosition)
    }
}
内部类ContentIdsDiffCallback(private val oldItems:List,private val newItems:List):DiffUtil.Callback(){
重写getOldListSize():Int{
返回oldItems.size
}
重写getNewListSize():Int{
返回newItems.size
}
覆盖乐趣项相同(oldItemPosition:Int,newItemPosition:Int):布尔值{
返回oldItems[oldItemPosition]==newItems[newItemPosition]
}
覆盖相同的内容(oldItemPosition:Int,newItemPosition:Int):布尔值{
返回相同的项目(旧项目位置、新项目位置)
}
}
这里没有什么奇怪的事情发生,因为我只处理ID

如何设置数据

fun setData(data: MutableList<Int>) {
    val diffCallback = ContentIdsDiffCallback(contentIds, data)
    val diffResult = DiffUtil.calculateDiff(diffCallback, true)
    contentIds.addAll(data)
    diffResult.dispatchUpdatesTo(this)
}
fun setData(数据:可变列表){
val diffCallback=ContentIdsDiffCallback(ContentID,数据)
val diffredesult=DiffUtil.calculateDiff(diffCallback,true)
contentIds.addAll(数据)
dispatchUpdatesTo(此)
}

因此,逻辑是,我已经注册了一个
registerOnPageChangeCallback
,并重写了该方法
onPageSelected

在那里,我检查用户刷了多少页,以及用户何时刷了60%的项目(
val sixtyPercentItems:Int=ceil(viewpager2Adapter.itemCount-1*0.6).toInt()
) 我调用API获取下一组项。 当该APi返回时,我调用
adapter.setData
(上面显示的方法)


发生这种情况时,我的适配器会重置为零我的列表没有重置,即,它正在添加项目,我没有保留任何会影响此行为的特殊变量。
我有点左右为难。这就是DiffUtil的全部意义,对吗?有人遇到过这个问题吗?

我找到了一个简单的解决办法,我对这个解决方案不满意,但目前还有效

val recyclerView = viewPager2.getChildAt(0) as RecyclerView
val state = recyclerView.layoutManager?.onSaveInstanceState()
yourAdapter.items = newItems //Update your items here
recyclerView.layoutManager?.onRestoreInstanceState(state)

我有同样的问题我有同样的问题,你能找到解决办法吗?