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

4

我有一个设置为水平滑动的ViewPager2。我的想法是构建一个无限滚动的页面。这个类大致如下所示:

class SwipeAdapter(fragmentActivity: FragmentActivity): FragmentStateAdapter(fragmentActivity)

我已经重写了通常的createFragment(position: Int): Fragment, 在这里我返回了一个新的Fragment。


private var contentIds = mutableListOf<Int>()

我还实现了...

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

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

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)
    }
}

由于我只涉及到 Id,所以这里没有什么花哨的东西。

我是如何设置数据的?

fun setData(data: MutableList<Int>) {
    val diffCallback = ContentIdsDiffCallback(contentIds, data)
    val diffResult = DiffUtil.calculateDiff(diffCallback, true)
    contentIds.addAll(data)
    diffResult.dispatchUpdatesTo(this)
}

在那里,我会检查用户已经划过了多少页,并且当用户已经划过了总项数的60%时(val sixtyPercentItems: Int = ceil(viewpager2Adapter.itemCount - 1 * 0.6).toInt()),我会调用我的API来获取下一组项。 当API返回后,我会调用adapter.setData 方法(如上所示)。


我有同样的问题。 - Jam
我也遇到了同样的问题,你找到解决方案了吗? - AndroidRuntimeException
1个回答

1
我发现了一个简单的解决方法,虽然不是很满意,但目前可行。
val recyclerView = viewPager2.getChildAt(0) as RecyclerView
val state = recyclerView.layoutManager?.onSaveInstanceState()
yourAdapter.items = newItems //Update your items here
recyclerView.layoutManager?.onRestoreInstanceState(state)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接