Как правильно загрузить больше элементов в recyclerView, используя Retrofit? (котлин)

Я действительно новичок в Android Dev, и на самом деле я работаю над личным проектом в Kotlin, используя модификацию для выполнения вызовов API.

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

Я не хочу такого поведения, я бы предпочел, чтобы все элементы просто складывались друг в друга, не теряя предыдущие элементы.

здесь, в моем фрагменте, это функция, которую я вызываю для повторного заполнения моего представления:

    private fun getPopularMovies(page: Int){
        val repository = MoviesRepositoryProvider.provideMovieRepository()
        repository.getPopularMovies(page)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe ({ result ->
                moviesAdapter = MovieAdapter(movies = result.results)
                moviesList.adapter = moviesAdapter
            }, { error ->
                error.printStackTrace()
            })
    }

посмотрите на библиотеку подкачки Android, у нее потрясающие функции developer.android.com/topic/libraries/architecture/paging

Ergin Ersoy 10.04.2019 11:47
1
2
1 189
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать библиотеку пейджинга: https://developer.android.com/topic/libraries/architecture/paging

Проблема здесь:

.subscribe ({ result ->
   moviesAdapter = MovieAdapter(movies = result.results)
   moviesList.adapter = moviesAdapter
}

Вы создаете новый адаптер для каждого ответа API. Вы хотите настроить адаптер один раз. Затем вы можете передавать результаты одному и тому же адаптеру для каждого ответа и вызывать notifyDatasetChanged()

Что-то типа:

// Initial adapter set
moviesAdapter = MovieAdapter()
moviesList.adapter = moviesAdapter

// Then on callback
.subscribe ({ result ->
   moviesList.addResults(result.results)
}

Затем внутри адаптера добавьте новые результаты в свой список и вызовите adapter.notifyDataSetChanged()

https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

Я думаю, что это сработает, я знал, что это что-то вроде этого, но, поскольку я действительно новичок в этом, я просто не могу понять, как это установить, это больше не повторится: D Я скажу вам, если это сработает

Endyrmion 09.04.2019 16:37

Я получаю кучу ошибок, я пытался избавиться от них, но я думаю, что вы будете более эффективны, чем я х) ! Когда я пытаюсь добавить эти переменные непосредственно внутри фрагмента, я получаю ошибку Unsolved Reference: ``` private varmoviesAdapter = MovieAdapter(movies = result.results) нерешенная ссылка Для адаптера.notifyDataSetChanged() я точно не знаю, куда его поместить ... Большое спасибо!

Endyrmion 09.04.2019 17:01

Для MovieAdapter инициализируйте с пустым конструктором, так как у вас еще нет ссылки на результаты, private var moviesAdapter = MovieAdapter(). moviesList должен сначала ссылаться на recyclerview, например, с помощью findViewById, он должен быть где-то в вашем коде, вы не опубликовали эту часть. addResults - это метод, который вам нужно определить....

veritas1 09.04.2019 17:27
Ответ принят как подходящий

@veritas1 был прав но чтобы правильно исправить мою ошибку, мне пришлось сделать так:

Все это есть в моем Фрагменте.

Сначала объявить адаптер и массив, который будет содержать мою информацию:

    private var moviesAdapter: MovieAdapter? = null
    private var movies = ArrayList<Movie>()

и в обратном вызове возьмите предыдущий запрос, а затем вызовите notifyDataSetChanged()

    movies.addAll(result.results)
    moviesAdapter!!.notifyDataSetChanged()

Поскольку я использую recyclerView, мне пришлось правильно установить свой адаптер

    private fun initRecyclerView(){
        moviesList.apply {layoutManager = layoutMng}
        moviesList.adapter = moviesAdapter
        moviesList.addOnScrollListener(
            InfiniteScrollListener({getPopularMovies(page)},{nextPage()}, layoutMng))
    }

Другие вопросы по теме