android - 如何使用 Retrofit 在 recyclerView 中正确加载更多项目?(科特林)
问题描述
我真的是 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()
推荐阅读
- java - 有没有可能通过Java并行运行soapUI测试用例
- javascript - v-on 处理程序中的错误:“错误:Reference.set 失败:第一个参数包含未定义”
- swift - 我得到线程 1:信号 SIGABRT 和我的 IOS 应用程序崩溃
- ios - 在 UITextView 中更改/动画 maximumNumberOfLines?
- android - Kotling :: Android :: java.lang.ClassCastException: java.lang.Class 无法转换为 androidx.lifecycle.ViewModel
- codeigniter - 在单个网站上加载多个域
- scikit-learn - ImportError:无法导入名称“_print_elapsed_time”
- c# - asp.net textbox lostfocus javascript调用,代码看起来不错但无法编译
- php - Magento - 在我的主题 After_Body_Start 的所有页面上添加一些 HTML/php/JS
- swift - 我无法将 MacPorts 的 /opt/local/include/ncurses.h 导入到我的 Swift 项目中。它与 macOS SDK /usr/include/curses.h 冲突。有什么提示吗?