Библиотека Android Paging 3: как изменить список с помощью нового параметра?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Библиотека Android Paging 3: как изменить список с помощью нового параметра?

Сообщение Anonymous »

У меня есть фрагмент поиска, который показывает список искомых элементов.
Если пользователь что-то вводит, я передаю эту строку в 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)
}
}
}
с помощью этого решения, изменив URL (

Код: Выделить всё

showPostList(newUrl)
, список останется без изменений. возможно, используя кешированный список в viewModel.
другое решение:
использование 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)
}
}
}
но при использовании этого обновления списка обратно на фрагмент, а иногда и на изменение состояния Recyclerview.

Подробнее здесь: https://stackoverflow.com/questions/656 ... -new-param
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»