可以将分页库和PagedList与ViewPager一起使用吗?

时间:2018-12-07 20:32:00

标签: android android-viewpager android-architecture-components android-paging android-paging-library

我想将ViewPager与分页库和PagedList一起使用。有没有办法做到这一点?如果是,那我应该使用什么适配器?

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

2 个答案:

答案 0 :(得分:1)

这是我目前正在玩的游戏。我已经看到了它的分页,但是我需要编写一些测试以确保它实际上可以提供任何好处。仍有很大的改进空间,但是我认为这是使其正常运行所必需的核心。

这要求您.setInitialLoadKey上的PageList。我无法让它响应诸如.smoothScrollToPosition之类的东西。它正在图像查看器自动柜员机中工作。

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

答案 1 :(得分:0)

通过关注此博客https://medium.com/@programmerr47/pagedlist-in-viewpager-976e7413ec46

,我将FragmentStateAdapter与PagedList一起使用了

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

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

请记住,您不能直接访问PagedList的内容,所以不要浪费时间