我是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()
})
}
问题在于:
.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()
@ 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))
}