gpt4 book ai didi

Android Paging 3 库 : how to change list with new param?

转载 作者:行者123 更新时间:2023-12-04 23:42:34 25 4
gpt4 key购买 nike

我有一个显示搜索项目列表的搜索 fragment 。
如果用户输入某些内容,我将该字符串作为新的查询参数传递给 url,并使用 paging 3 库获取新列表。
第一个解决方案是:

//viewModel
lateinit var postListUrl: String

val postList: Flow<PagingData<Post>> = Pager(PagingConfig(pageSize = 20)) {
PostPagingSource(postRepository, postListUrl)
}.flow.cachedIn(viewModelScope)

//fragment
fun showPostList(url: String) {
postListAdapter.submitData(lifecycle, PagingData.empty())
viewModel.postListUrl = url
viewLifecycleOwner.lifecycleScope.launch {
viewModel.postList.collectLatest {
postListAdapter.submitData(it)
}
}
}
通过这个解决方案通过更改 url ( showPostList(newUrl) ,列表保持没有任何更改。可能在 viewModel 中使用缓存列表。
另一个解决方案是:
使用 showPostList(initUrl)onViewCreated fragment ,然后通过更改参数使用自爆方法:
//fragment
fun changePostList(url: String) {
viewModel.postListUrl = url
postListAdapter.refresh()
}
这项工作,但如果旧列表和新列表有共同的项目,新的列表显示在最后一个共同的可见项目。
例如,如果旧列表的第 5 位项目与新列表的第 7 位相同,则在列表更改以显示新列表后,它从第 7 位而不是第一项开始。
我找到了另一个解决方案 here :
//viewModel
val postListUrlFlow = MutableStateFlow("")
val postList = postListUrlFlow.flatMapLatest { query ->
Pager(PagingConfig(pageSize = 20)) {
PostPagingSource(postRepository, query)
}.flow.cachedIn(viewModelScope)
}

//fragment
fun showPostList(url: String) {
postListAdapter.submitData(lifecycle, PagingData.empty())
viewModel.postListUrlFlow.value = url
viewLifecycleOwner.lifecycleScope.launch {
viewModel.postList.collectLatest {
postListAdapter.submitData(it)
}
}
}
但是通过使用此列表刷新返回 fragment ,有时 Recyclerview状态变化。

最佳答案

class MyViewModel:ViewModel(){
private val _currentQuery = MutableLiveData<String>()
val currentQuery:LiveData<String> = _currentQuery


val users = _currentQuery.switchMap { query->
Pager(PagingConfig(pageSize = 20)) {
PostPagingSource(postRepository, query)
}.livedata.cachedIn(viewModelScope)

}


fun setCurrentQuery(query: String){
_currentQuery.postValue(query)
}
}
通过使用

SwitchMap


每次更改查询时都可以获得新结果,它将替换旧数据。

关于Android Paging 3 库 : how to change list with new param?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65643600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com