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

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

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

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

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

0 голосов
/ 10 апреля 2019

@ 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 голосов
/ 09 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...