3

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

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

我已经覆盖了createFragment(position: Int): Fragment我返回新片段的通常情况


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

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


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

因为我只处理 ID,所以这里没有什么特别的事情发生。

我如何设置数据?

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


所以逻辑是,我已经注册了一个registerOnPageChangeCallback并覆盖了方法 onPageSelected

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


令人惊讶的是,当这种情况发生时,我的适配器重置为零!我的列表没有重置,即它正在添加项目,我没有保留任何会影响此行为的特殊变量。我有点在修复中。这就是 DiffUtil 的重点,对吧?有人遇到过这个吗?

4

1 回答 1

0

我找到了一个简单的解决方法,我对解决方案不满意,但现在可以使用。

val recyclerView = viewPager2.getChildAt(0) as RecyclerView
val state = recyclerView.layoutManager?.onSaveInstanceState()
yourAdapter.items = newItems //Update your items here
recyclerView.layoutManager?.onRestoreInstanceState(state)
于 2020-07-09T16:33:33.023 回答