Android 您可以将分页库和分页列表与ViewPager一起使用吗?

Android 您可以将分页库和分页列表与ViewPager一起使用吗?,android,android-viewpager,android-architecture-components,android-paging,android-paging-library,Android,Android Viewpager,Android Architecture Components,Android Paging,Android Paging Library,我想使用带有分页库和分页列表的ViewPager。有办法做到这一点吗?如果是,那么我应该使用什么适配器 现在我使用FragmentStatePagerAdapter和完整的项目列表。我想按需加载项目页面,而不是一次加载所有数据。这就是我目前正在玩的游戏。我见过它的分页,但我需要编写一些测试来确保它实际上提供了任何好处。仍然有很大的改进空间,但我认为这是它运行所必需的核心 这需要您在页面列表上设置.setInitialLoadKey。我无法让它响应类似.smoothScrollToPosition

我想使用带有分页库和分页列表的ViewPager。有办法做到这一点吗?如果是,那么我应该使用什么适配器


现在我使用FragmentStatePagerAdapter和完整的项目列表。我想按需加载项目页面,而不是一次加载所有数据。

这就是我目前正在玩的游戏。我见过它的分页,但我需要编写一些测试来确保它实际上提供了任何好处。仍然有很大的改进空间,但我认为这是它运行所必需的核心

这需要您在
页面列表
上设置
.setInitialLoadKey
。我无法让它响应类似
.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()
    }
}

抽象类PagedListPagerAdapter(fm:FragmentManager)
:FragmentStatePagerAdapter(调频){
变量pagedList:pagedList?=空
专用设备
private var callback=PagerCallback()
重写fun getCount()=页面列表?.size?:0
抽象项(位置:Int):片段
抽象变量isSmoothScroll:布尔值
覆盖趣味getItem(位置:Int):片段{
页面列表?.loadAround(位置)
返回createItem(位置)
}
fun getValue(位置:Int):T{
返回页面列表?获取(位置)
}
有趣的提交列表(页面列表:页面列表?){
此.pagedList?.removeWeakCallback(回调)
this.pagedList=页面列表
this.pagedList?.addWeakCallback(null,回调)
notifyDataSetChanged()
}
私有内部类PagerCallback:PagedList.Callback(){
override-fun-onChanged(位置:Int,计数:Int)=notifyDataSetChanged()
override fun onInserted(位置:Int,计数:Int)=notifyDataSetChanged()
覆盖已删除(位置:Int,计数:Int)=notifyDataSetChanged()
}
}
class ViewerAdapter(fm:FragmentManager)
:PagedListPagerAdapter(调频){
覆盖变量isSmoothScroll=false
覆盖趣味createItem(位置:Int):片段{
val fragment=ViewPagerFragment()
fragment.source=getValue(位置)
返回片段
}
}

我跟随这个博客使用了带有页面列表的FragmentStateAdapter

黑客是根据您的功能创建一个类/抽象类,扩展FragmentStateAdapter或ViewPager或任何类似的类,并向其中添加PagedList。 然后是继承/实现它的另一个类

在第二个类对象上调用submitList(我们的自定义方法),您将需要处理其余的。不过,这个博客很好地利用了资源和回调来提高效率

请记住,您无法直接访问页面列表的内容,因此不要浪费时间

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