Якорь в getRefreshpage является случайным, когда PagingData недействительна во время Lazycolumn ScrolkAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Якорь в getRefreshpage является случайным, когда PagingData недействительна во время Lazycolumn Scrolk

Сообщение Anonymous »

Я использую 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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