Android Compose Paging 3 – загрузка всех страниц одновременно без прокрутки в LazyColumn с сетевым вызовом и без внутренAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android Compose Paging 3 – загрузка всех страниц одновременно без прокрутки в LazyColumn с сетевым вызовом и без внутрен

Сообщение Anonymous »

Я работаю над проектом Android Compose, в котором использую Paging 3 вместе с LazyColumn для отображения списка элементов, полученных в результате сетевого вызова. По умолчанию Paging 3 загружает страницы на основе prefetchDistance при прокрутке пользователем, но в моем случае при запуске экрана загружается около 15 страниц, каждая из которых содержит 10 записей.
У меня есть попробовал установить prefetchDistace на 10, но это не работает.
Вот мой код:
ViewModel

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

class ShowAllNotificationsViewModel @Inject constructor(private val pagingSource: NotificationPagingSource) :
BaseViewModel() {

private val _uiState =
MutableStateFlow(UIState.StateLoading)
val uiState = _uiState.asStateFlow()

private val _isRefreshing = MutableStateFlow(false)
val isRefreshing = _isRefreshing.asStateFlow()

val items: Flow
> = Pager(
config = PagingConfig(
pageSize = 10,
prefetchDistance = 5,
enablePlaceholders = false,
),
pagingSourceFactory = { pagingSource }
)
.flow
.cachedIn(viewModelScope)

fun refreshData() {
pagingSource.invalidate()
}
}
Источник страниц:

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

class NotificationPagingSource @Inject constructor(val requestNotificationsUseCase: GetNotificationsUseCase) :
PagingSource() {

override suspend fun load(params: LoadParams): LoadResult {
Timber.e(IllegalStateException())
Timber.d("load params = $params")
val responseModel = requestNotificationsUseCase(params.key)
val result = responseModel?.getAsResult();
result?.let {
return@load when (result) {
is Result.Error,
Result.Loading,
is Result.SessionTimeoutError -> {
LoadResult.Error(
SessionTimeoutException()
)
}

is Result.Success -> {

LoadResult.Page(
result.value.data?.notifications ?: listOf(),
prevKey = null,
nextKey = result.value.data?.lastId,
)
}
}
}
return LoadResult.Error(
IllegalStateException()
)
}

override fun getRefreshKey(state: PagingState): String? {
Timber.d("getRefreshKey = state = $state")
return null
}
}
Интерфейс:

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

 @Composable
fun ShowAllNotificationCompose(items: LazyPagingItems) {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.Black)
) {
Timber.d("ShowAllNotificationCompose : state = ${items.loadState}")
HeaderCompose()

Box(
modifier = Modifier
.weight(1f)
) {
val listState = rememberLazyListState()

LazyColumn(
modifier = Modifier,
state = listState
) {
items(
count = items.itemCount,
key = {
items[it]?.id ?: 0
}
) {
val notificationModel = items[it]
if (notificationModel != null) {
NotificationItem(item = notificationModel)
} else {
NotificationShimmerItem()
}
}
if (items.loadState.append == LoadState.Loading) {
items(2) {
NotificationShimmerItem()
}
}
}
}
}
}
}
Есть ли способ изменить эту настройку, чтобы гарантировать, что запрос на разбиение на страницы вызывается только после достижения prefectchDistance.
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/777 ... -in-lazyco
Ответить

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

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

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

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

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