我有一个设置为水平滑动的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
方法(如上所示)。