Можете ли вы использовать библиотеку подкачки и PagedList с ViewPager?
Я хотел бы использовать ViewPager с библиотекой подкачки и PagedList. Есть ли способ сделать это? Если да, то какой адаптер мне использовать?
Прямо сейчас я использую FragmentStatePagerAdapter с полным списком элементов. Я хотел бы загружать страницы элементов по требованию, а не загружать все данные сразу.
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
}
}
Я использовал FragmentStateAdapter с PagedList, подписавшись на этот блог https://medium.com/@programmerr47/pagedlist-in-viewpager-976e7413ec46
Хакерство заключается в том, что вы создаете класс / абстрактный класс, расширяющий FragmentStateAdapter или ViewPager или любой аналогичный класс в соответствии с вашими функциями и добавляющий к нему PagedList. Затем другой класс наследует / реализует его.
Вызовите submitList (наш собственный метод) для этого второго объекта класса, и вам нужно будет обработать все остальное. В этом блоге, однако, хорошо используются ресурсы и обратные вызовы, чтобы сделать это эффективным.
Помните, что вы не можете напрямую получить доступ к содержимому PagedList, поэтому не тратьте время на это.