Я действительно новичок в 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()
})
}
@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))
}
Вопрос здесь:
.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()
Вы можете использовать библиотеку подкачки: https://developer.android.com/topic/libraries/architecture/paging