我想使用带有分页库和 PagedList 的 ViewPager。有没有办法做到这一点?如果是,那么我应该使用什么适配器?
现在我使用带有完整项目列表的 FragmentStatePagerAdapter。我想按需加载项目页面,而不是一次加载所有数据。
我想使用带有分页库和 PagedList 的 ViewPager。有没有办法做到这一点?如果是,那么我应该使用什么适配器?
现在我使用带有完整项目列表的 FragmentStatePagerAdapter。我想按需加载项目页面,而不是一次加载所有数据。
这就是我目前正在玩的。我已经看到它分页,但我需要编写一些测试以确保这实际上提供了任何好处。还有很大的改进空间,但我认为这是它发挥作用所必需的核心。
这需要您.setInitialLoadKey
在PageList
. 我无法让它响应类似.smoothScrollToPosition
. 它在图像查看器 atm 中工作。
abstract class PagedListPagerAdapter<T>(fm: FragmentManager)
: FragmentStatePagerAdapter(fm) {
var pagedList: PagedList<T>? = null
private set
private var callback = PagerCallback()
override fun getCount() = pagedList?.size ?: 0
abstract fun createItem(position: Int): Fragment
abstract var isSmoothScroll: Boolean
override fun getItem(position: Int): Fragment {
pagedList?.loadAround(position)
return createItem(position)
}
fun getValue(position: Int): T? {
return pagedList?.get(position)
}
fun submitList(pagedList: PagedList<T>?) {
this.pagedList?.removeWeakCallback(callback)
this.pagedList = pagedList
this.pagedList?.addWeakCallback(null, callback)
notifyDataSetChanged()
}
private inner class PagerCallback : PagedList.Callback() {
override fun onChanged(position: Int, count: Int) = notifyDataSetChanged()
override fun onInserted(position: Int, count: Int) = notifyDataSetChanged()
override fun onRemoved(position: Int, count: Int) = notifyDataSetChanged()
}
}
class ViewerAdapter(fm: FragmentManager)
: PagedListPagerAdapter<ImageInfo>(fm) {
override var isSmoothScroll = false
override fun createItem(position: Int): Fragment {
val fragment = ViewPagerFragment()
fragment.source = getValue(position)
return fragment
}
}
hack 是您创建一个类/抽象类,根据您的功能扩展 FragmentStateAdapter 或 ViewPager 或任何类似的类,并将 PagedList 添加到其中。然后另一个类继承/实现它。
在第二个类对象上调用 submitList(我们的自定义方法),您需要处理其余部分。不过,这个博客很好地利用了资源和回调来提高效率。
请记住,您不能直接访问 PagedList 的内容,所以不要浪费时间