无法使用分页刷新 recyclerView
Unable to refresh recyclerView with pagination
我有一个 RecyclerView
填充了分页数据。
我需要能够通过 SwipeRefreshLayout
刷新它,但到目前为止,我无法这样做。
我已经尝试了很多与此类似的参考资料,但都没有成功。另外,为了让你们知道,当我刷新时,数据被正确检索,但它没有显示在 recyclerView 上...
此外,当我从那个目的地通过 Navigation
移动到另一个目的地,然后我回击时,它得到了更新。我不确定我遗漏了什么或做错了什么。
视图模型:
class ActivityViewModel : ViewModel() {
var itemDataSourceFactory = OperationsDataSourceFactory()
private set
val livePagedList: LiveData<PagedList<Result<Operation?>>>
init {
val config = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setInitialLoadSizeHint(10)
.setPageSize(10)
.build()
livePagedList = LivePagedListBuilder(itemDataSourceFactory, config).build()
}
fun refresh() {
itemDataSourceFactory.dataSourceLiveData.value?.endCursor = null
itemDataSourceFactory.refresh()
}
}
数据源工厂:
class OperationsDataSourceFactory :
DataSource.Factory<String, Result<Operation?>>() {
val dataSourceLiveData = MutableLiveData<OperationsDataSource>()
lateinit var dataSource: OperationsDataSource
override fun create(): DataSource<String, Result<Operation?>> {
dataSource = OperationsDataSource()
dataSourceLiveData.postValue(dataSource)
return dataSource
}
fun refresh(){
dataSourceLiveData.value?.invalidate()
}
}
而且,在 Fragment 上,我有这样的东西:
private fun initView() {
binding.swipeToRefresh.setOnRefreshListener {
itemViewModel.refresh()
}
getData() //observables with adapter.submitList(list)
}
好的,经过长时间的研究,这可能不是最好的解决方案,但开发人员也使用它。我们需要使 layoutManager
和适配器“无效”。
swipeToRefresh.setOnRefreshListener {
operationsRecycler.apply {
layoutManager = null
adapter = null
layoutManager = LinearLayoutManager(
requireContext(),
LinearLayoutManager.VERTICAL,
false
)
adapter = myAdapter
}
我有一个 RecyclerView
填充了分页数据。
我需要能够通过 SwipeRefreshLayout
刷新它,但到目前为止,我无法这样做。
我已经尝试了很多与此类似的参考资料,但都没有成功。另外,为了让你们知道,当我刷新时,数据被正确检索,但它没有显示在 recyclerView 上...
此外,当我从那个目的地通过 Navigation
移动到另一个目的地,然后我回击时,它得到了更新。我不确定我遗漏了什么或做错了什么。
视图模型:
class ActivityViewModel : ViewModel() {
var itemDataSourceFactory = OperationsDataSourceFactory()
private set
val livePagedList: LiveData<PagedList<Result<Operation?>>>
init {
val config = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setInitialLoadSizeHint(10)
.setPageSize(10)
.build()
livePagedList = LivePagedListBuilder(itemDataSourceFactory, config).build()
}
fun refresh() {
itemDataSourceFactory.dataSourceLiveData.value?.endCursor = null
itemDataSourceFactory.refresh()
}
}
数据源工厂:
class OperationsDataSourceFactory :
DataSource.Factory<String, Result<Operation?>>() {
val dataSourceLiveData = MutableLiveData<OperationsDataSource>()
lateinit var dataSource: OperationsDataSource
override fun create(): DataSource<String, Result<Operation?>> {
dataSource = OperationsDataSource()
dataSourceLiveData.postValue(dataSource)
return dataSource
}
fun refresh(){
dataSourceLiveData.value?.invalidate()
}
}
而且,在 Fragment 上,我有这样的东西:
private fun initView() {
binding.swipeToRefresh.setOnRefreshListener {
itemViewModel.refresh()
}
getData() //observables with adapter.submitList(list)
}
好的,经过长时间的研究,这可能不是最好的解决方案,但开发人员也使用它。我们需要使 layoutManager
和适配器“无效”。
swipeToRefresh.setOnRefreshListener {
operationsRecycler.apply {
layoutManager = null
adapter = null
layoutManager = LinearLayoutManager(
requireContext(),
LinearLayoutManager.VERTICAL,
false
)
adapter = myAdapter
}