Мой вопрос: как использовать mapByPage
при использовании PageKeyedDataSource
.В настоящее время я получаю
java.lang.ClassCastException: androidx.paging.DataSource$Factory$1 cannot
be cast to com.exmple.paging.MyDataSource$Factory
// ...
Итак, началось с DataSource и его фабрики:
class MyDataSource private constructor(
private val query: Query
) : PageKeyedDataSource<Query, Message>() {
// Here I'm trying to get the loading states while each method of DataSource
// is doing the work
private val _loadState = MutableLiveData<LoadingState>()
val loadState: LiveData<LoadingState>
get() = loadState
override fun loadInitial(params: LoadInitialParams<Query>,
callback: LoadInitialCallback<Query, Message>) {
// Getting loading states for UI
loadStateMld.value = NetworkState.loading()
doWork()
}
override fun loadAfter(params: LoadParams<Query>,
callback: LoadCallback<Query, Message>) {
loadStateMld.value = NetworkState.loading()
doMoreWork()
}
// ...
// The factory
class Factory private constructor(
private val query: Query
) : DataSource.Factory<Query, Message>() {
private val _sourceMld = MutableLiveData<MyDataSource>()
val sourceLd: LiveData<MyDataSource>
get() = _sourceMld
override fun create(): DataSource<Query, Message> {
val itemKeyedDataSource = MyDataSource(query)
_sourceMld.postValue(itemKeyedDataSource)
return itemKeyedDataSource
}
}
}
В ViewModel я получаю сообщение об ошибке в следующей строке
val liveData = Transformations.switchMap(userName) { name ->
val query: Query = messageColRefQuery.whereArrayContains("name", name)
val factory = MessageDataSource.Factory(
query
).mapByPage {
// will be doing some work here
it
}
LivePagedListBuilder(factory, config).build()
}
// Getting loading states to display on UI
private val loadState = Transformations.switchMap(liveData) { input ->
// This line is causing the error
val dataSource = input.dataSource as MyDataSource
dataSource.loadStateLd
}
Дело в том, что цепочка mapByPage
возвращает DataSource.Factory<Query, Message>
, тогда как она должна возвращать MyDataSource.Factory
.Таким образом, в результате, когда я пытаюсь получить loadState
LiveData из источника данных, он вызывает ошибку, не приводя его к соответствующему классу.
Если я пытаюсь привести цепочку, онтакже происходит сбой:
val factory = MessageDataSource.Factory(query).mapByPage { it } as MyDataSource.Factory
Без использования функции map
все работает нормально.Любая помощь приветствуется.