Если пользователь что-то вводит, я передаю эту строку в URL в качестве нового параметра запроса и получаю новый список, используя библиотеку подкачки 3.
Первое решение:
Код: Выделить всё
//viewModel
lateinit var postListUrl: String
val postList: Flow
> = 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)
}
}
}
Код: Выделить всё
showPostList(newUrl)другое решение:
использование showPostList(initUrl) в onViewCreated фрагмента, а затем использование метода Blow путем изменения параметра:
Код: Выделить всё
//fragment
fun changePostList(url: String) {
viewModel.postListUrl = url
postListAdapter.refresh()
}
например, если 5-й элемент старого списка совпадает с 7-м элементом нового списка, то после изменения списка для отображения нового списка он начинается с 7-й позиции, а не с первого элемента.
Я нашел другое решение здесь:
Код: Выделить всё
//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)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/656 ... -new-param
Мобильная версия