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

1

Я действительно новичок в 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()
            })
    }
Теги:
kotlin
retrofit

3 ответа

0

@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))
    }
0

Вопрос здесь:

.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()

  • 1
    Я думаю, что это сработает, я знал, что это что-то подобное, но так как я действительно новичок в этом, я просто не могу понять, как его установить, это не повторится: D Я скажу вам, если это работает
  • 0
    Я получаю кучу ошибок, я пытался от них избавиться, но, думаю, вы будете более эффективны, чем я x)! Когда я пытаюсь добавить эти переменные непосредственно внутри фрагмента, я получаю ошибку Unsolved Reference: `` `private var moviesAdapter = MovieAdapter (movies = result.results) private var moviesList.adapter = moviesAdapter` `` И в обратном вызове addResult также Неразрешенная ссылка Для adapter.notifyDataSetChanged () Я не знаю точно, где его поставить ... Спасибо, любезно!
Показать ещё 1 комментарий
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню