我真的是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()
})
}
答案 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))
}