Android-ViewPager2在调用Diffutil.dispatchUpdatesTo时将适配器位置重置为0
我有一个ViewPager2,它被设置为水平滑动。我的想法是建立一个无限滚动寻呼机。这个类看起来像这样: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
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)
我有同样的问题我有同样的问题,你能找到解决办法吗?