我有一个 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 的重点,对吧?有人遇到过这个吗?