Я использую Paging3, чтобы показать список транзакций из DB. Все данные о транзакции извлекаются из сервисного обслуживания и сохраняются в DB в фоновом режиме. Для моего списка транзакций DB является единственным источником истины. Из -за фоновой вставки DB мой источник данных Paging несколько раз недействителен. Хотя я выступаю с недействительной на 2 секунды, чтобы устранить более частые признания. В то время как мои данные о пейджингели в несколько раз я прокручиваю список из ливней. Я заметил, что моя позиция прокрутки сбрасывается в какой -то обратный старый индекс, если я прокручиваю вперед. После расследования я узнал, что получаю некоторую случайную анкепозицию в getRefreshkey () в моем PagingData. Я также заметил, что моя Lazycolumn повторно создает свой элемент для некоторого более старого индекса. < /p>
class TxnPagingDataSource(
private val db: MyDatabase,
roomSqliteQuery: SimpleSQLiteQuery,
private val observableTables: Array = arrayOf(),
private val invalidationThreshold: Long = 2000
) : BasePagingSource(db = db) {
private val countQuery =
"SELECT COUNT(*) FROM ( " + roomSqliteQuery.sql + " )"
private var limitOffsetQuery = "SELECT * FROM ( " + roomSqliteQuery.sql + " ) LIMIT ? OFFSET ?"
private val invalidated = AtomicBoolean(false)
init {
if (observableTables.isNotEmpty()) {
db.invalidationTracker.addObserver(object :
InvalidationTracker.Observer(observableTables) {
override fun onInvalidated(tables: Set) {
db.invalidationTracker.removeObserver(this)
if (invalidated.compareAndSet(false, true)) {
postInvalidation()
}
}
})
}
}
private fun postInvalidation() {
Handler(Looper.getMainLooper()).postDelayed({
invalidate()
}, invalidationThreshold)
}
override suspend fun getItemCount(): Int {
val itemCount =
db.getTransactionDao().getLongValue(SimpleSQLiteQuery(countQuery))?.toInt()
?: 0
return itemCount
}
override suspend fun getItems(offset: Int, limit: Int): List {
val transactionEntities = db.getTransactionCoreDao()
.transactionsRawQuery(SimpleSQLiteQuery(limitOffsetQuery, arrayOf(limit, offset)))
return transactionEntities
}
override fun getRefreshKey(state: PagingState): Int? {
val closestItem =
state.anchorPosition?.let { state.closestItemToPosition(it)?.transactionId }
val refreshKey = super.getRefreshKey(state)
Logger.logd { "RenderDebug[TxnScrollDebug]: getRefreshKey with anchorPosition:${state.anchorPosition}, closestItemId: $closestItem, refreshKey: $refreshKey" }
return refreshKey
}
}
Для реализации загрузки и getrefreshkey Я использую ту же логику, которая находится в официальном автогенерированном коде PagingData. Потому что я не хочу добавлять дополнительную зависимость для этого, следовательно, скопировал это в BasePagingSource
Добавление ниже Lazycolumn
@Composable
fun TransactionListScreen(viewModel: MyTransactionViewModel) {
val txnPagedData = viewModel.transactionPagedData.collectAsLazyPagingItems()
val actionClick: (Map) -> Unit = remember {
{
}
}
val lazyListState = rememberLazyListState()
LazyColumn(
state = lazyListState,
modifier = Modifier
.fillMaxSize()
.background(color = Color.White)
) {
items(
count = transactionPagedData.itemCount,
key = transactionPagedData.itemKey { it.transactionId }) { index: Int ->
val data = transactionPagedData[index]
val txnId = data.transactionId
Logger.logd { "RenderDebug[TxnScrollDebug] loading index on LazyColumn: $index, for txnId: ${txnId}" }
TransactionHistoryListItem(
title = data.titleDisplayText,
name = data.payeeNameDisplayText,
time = data.displayTimeStampText,
amount = data.displayAmount,
debitCreditText = data.debitCreditInfoDisplayText,
imageUrl = "https://www.google.com"
}
}
}
< /code>
Прикрепление журналов Lazycolumn Calling My LazyItem. В строке № 8-10 возникает внезапная падение доступа к индексам 29-11. Я не могу понять, что это связано с внутренней реализацией PagingData или из -за Lazycolumn для вызывания случайных индексов.RenderDebug[TxnScrollDebug] loading index on LazyColumn: 26
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 27
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 24
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 25
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 23
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 22
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 28
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 29
RenderDebug[TxnScrollDebug]: LOAD_INFO, prevKey: 36, nextKey: 66 , itemsBefore:36 , itemAfter: 1169
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 21
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 26
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 27
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 24
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 25
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 23
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 22
RenderDebug[TxnScrollDebug] loading index on LazyColumn: 28
Подробнее здесь: https://stackoverflow.com/questions/796 ... ting-durin
Якорь в getRefreshpage является случайным, когда PagingData недействительна во время Lazycolumn Scrolk ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Позиция-якорь не работает, когда якорь находится в положении: исправлено
Anonymous » » в форуме Html - 0 Ответы
- 37 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Позиция-якорь не работает, когда якорь находится в положении: исправлено
Anonymous » » в форуме Html - 0 Ответы
- 34 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Позиция-якорь не работает, когда якорь находится в положении: исправлено
Anonymous » » в форуме Html - 0 Ответы
- 34 Просмотры
-
Последнее сообщение Anonymous
-