Как преобразовать элементы в PagedList? (Библиотека подкачки компонентов Android Arch) - PullRequest
0 голосов
/ 27 апреля 2018

Компонент архитектуры Android теперь представлен Библиотека подкачки , и это здорово.

Согласно официальной демонстрации DataSource.Factory теперь поддерживает методы map и mapByPage, что означает, что мы можем преобразовывать элементы в один DataSource.

Но DataSource и DataSource.Factory должны быть на уровне модели, а не на уровне Presentor / View. Однако во многих случаях мы хотим преобразовать данные в нашем адаптере (для RecyclerView или ListView), и, очевидно, это логика уровня Presentor / View. К настоящему времени адаптер содержит экземпляр PagedList, но PageList не может поддерживать эти операции, что довольно неудобно. Кроме того, бывают моменты, когда мы хотим добавлять или удалять элементы в PagedList.

.

Итак, это запрос функции:

  1. Преобразование предмета поддержки на PagedList

  2. Поддержка элемента добавление / удаление в / из PagedList

Любая дискуссия приветствуется.

1 Ответ

0 голосов
/ 27 октября 2018

Я думаю, вам нужно использовать преобразования для PagedList вместо LiveData<List<YourModel>>.

Например, у меня есть список Pet, у каждого Pet есть gender. Мне нужно показать пейджинг Pet и фильтр gender во время выполнения.

Итак, мой интерфейс Дао может быть:

@Dao
inteface PetDao {
    @Query("SELECT * FROM Pet WHERE Pet.gender = :gender ORDER BY Pet.id ASC")
    fun getPetsByGenderDataFactory(gender: String?): Datasource.Factory<Int, Pet>
}

В классе ViewModel я буду использовать Transformations для фильтрации LiveData<PagedList<Pet>> вместо LiveData<List<Pet>>:

class PetViewModel {

    private val genderMutableData: MutableLiveData<String> = MutableLiveData()
    private val petItemsData: LiveData<PagedList<Pet>> = Transformations.switchMap(this@PetViewModel.genderMutableData) { petGender ->
        LivePagedListBuilder(AppDatabase.getDefault().getPetDao().getPetsByGenderDataFactory(petGender), 20).build()
    }

}

Когда пользователь меняет gender на Pet, вы просто обновляете значение genderMutableData, он запускает источник данных для petItemsData и обновляет элементы Pet:

fun updatePetItemsWithNewGender(gender: String?) {
    this@PetViewModel.genderMutableData.postValue("female")
}

Извините, я использую Kotlin, например, потому что вы не помечаете пост на языке Java.

...