mapByPage и PageKeyedDataSource ClassCastException - PullRequest
0 голосов
/ 02 мая 2019

Мой вопрос: как использовать 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 все работает нормально.Любая помощь приветствуется.

...