Можете ли вы использовать библиотеку подкачки и PagedList с ViewPager? - PullRequest
0 голосов
/ 07 декабря 2018

Я бы хотел использовать ViewPager с библиотекой подкачки и PagedList.Есть ли способ сделать это?Если да, то какой адаптер мне использовать?

Сейчас я использую FragmentStatePagerAdapter с полным списком элементов.Я хотел бы загружать страницы элементов по требованию, а не загружать все данные сразу.

1 Ответ

0 голосов
/ 10 февраля 2019

Это то, с чем я сейчас играю.Я видел это пейджингом, но мне нужно написать несколько тестов, чтобы убедиться, что это действительно дает какие-то преимущества.Еще много возможностей для улучшений, но я думаю, что это ядро, необходимое для его функционирования.

Для этого вам необходимо .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
    }
}
...