Я действительно новичок в 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()
})
}
Вы можете использовать библиотеку пейджинга: 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 Я скажу вам, если это сработает
Я получаю кучу ошибок, я пытался избавиться от них, но я думаю, что вы будете более эффективны, чем я х) ! Когда я пытаюсь добавить эти переменные непосредственно внутри фрагмента, я получаю ошибку Unsolved Reference: ``` private varmoviesAdapter = MovieAdapter(movies = result.results) нерешенная ссылка Для адаптера.notifyDataSetChanged() я точно не знаю, куда его поместить ... Большое спасибо!
Для MovieAdapter инициализируйте с пустым конструктором, так как у вас еще нет ссылки на результаты, private var moviesAdapter = MovieAdapter()
. moviesList
должен сначала ссылаться на recyclerview, например, с помощью findViewById, он должен быть где-то в вашем коде, вы не опубликовали эту часть. addResults
- это метод, который вам нужно определить....
@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))
}
посмотрите на библиотеку подкачки Android, у нее потрясающие функции developer.android.com/topic/libraries/architecture/paging