如何使用Retrofit在recyclerView中正确加载更多项目? (科特琳)

时间:2019-04-09 14:03:28

标签: android kotlin 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()
            })
    }

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分: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()

答案 2 :(得分: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))
    }