OMGcoder
@OMGcoder
Начинающий java программист

Как архитектурно правильно управлять пагинацией?

Ребят. Помогите с пагинацией.

Во фрагменте есть Toolbar и RecyclerView.

На тулбаре присутствует SearchView.

По ивенту QueryTextSubmit() я должен "реинициализировать" пагинацию
таким образом что бы очистить полностью текущие данные и
дать параметры запроса в DataSource для загрузки новых даных.

Пагинация реализована полностью по даному примеру:
https://medium.com/@sharmadhiraj.np/android-paging...

Как это правильнее всего сделать что бы не возникало конфликтов
с жизненными циклами фрагмента и его активити?

У меня первая мысль вынести тело блока init {} в отдельный метод
скажем в public fun initPagination(searchRequest: SearchRequest? = null)

Внутри этого метода в конструктор DataSourceFactory передать SearchRequest и далее походу
с ним работать в DataSource.loadInitial()/DataSource.loadAfter()

Но этот вариант мне кажется костыльным.

class ImagesViewModel : ViewModel() {

    private val imageService = API.getApi().create(ImageService::class.java)
    var imageList: LiveData<PagedList<ImageItem>>
    private val compositeDisposable = CompositeDisposable()
    private val pageSize = 5
    private var imageDataSourceFactory: ImageDataSourceFactory

    init {
        imageDataSourceFactory = ImageDataSourceFactory(compositeDisposable, imageService)
        val config = PagedList.Config.Builder()
                .setPageSize(pageSize)
                .setInitialLoadSizeHint(pageSize * 2)
                .setEnablePlaceholders(false)
                .build()
        imageList = LivePagedListBuilder(imageDataSourceFactory, config).build()
    }



    fun getState(): LiveData<State> = Transformations.switchMap<ImageDataSource,
            State>(imageDataSourceFactory.imageDataSourceLiveData, ImageDataSource::state)

    fun retry() {
        imageDataSourceFactory.imageDataSourceLiveData.value?.retry()
    }

    fun listIsEmpty(): Boolean {
        return imageList.value?.isEmpty() ?: true
    }

    override fun onCleared() {
        super.onCleared()
        compositeDisposable.dispose()
    }
}
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
PagedListAdapter, серьёзно? Гугол в очередной раз родил какую-то хренотень. Похоже, создатели RecyclerView не рассказали автору этой либы, что адаптер никакого отношения к получению данных(коим, конечно, является пагинация) не имеет.

Короче, как надо. Данные должны прилетать в адаптер списком и он их должен отображать. Где-то во вью слое должна быть подписка на события скроллов ресайклера и определение, доскроллился ли он до конца. Когда доскроллился, нужно оповещать об этом презентационный слой, который попросит у модели ещё данных. Модель вытянет данные, отдаст презентации, данные сконвертятся и отдадутся во вью слой, который передаст их снова в адаптер, который их покажет.

Конец.

Никакая либа, которая трогает адаптер и вообще навешивает кучу сущностей, не нужна.

P.S. статья использует Rx в качестве фреймворка коллбеков. Божественно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы