Сортировать элементы массива при использовании PagedListAdapter?
Я использую библиотеку подкачки.
В настоящее время я хочу отсортировать (используя SortList) элементы по описанию в PagedListAdapter, но я не понял, как это сделать.
Как отсортировать элементы при использовании PagedListAdapter? Спасибо.
3 ответа
Я тоже столкнулся с этой проблемой и был удивлен, что PagedList
похоже, нет простого способа сортировки элементов. Вот как я добился нужного эффекта с помощью DataSourcemapByPage()
:
/** sorts MyItems by timestamp in descending order */
private fun DataSource.Factory<Long, MyItem>.sortByDescTime(): DataSource.Factory<Long, MyItem> {
return mapByPage {
myItemsList.sortedWith(compareByDescending { item -> item.timeStamp })
}
}
т.е. ввод mapByPage()
должна быть вашей функцией сортировки (в зависимости от вашей настройки, моя использует расширения Kotlin и синтаксис лямбда для сортировки элементов в целевом списке - используя Collections.sortedWith()
)
А затем использовал мою функцию расширения в источнике данных для сортировки извлеченных элементов:
fun fetchItems(userId: Long): LiveData<PagedList<MyItem>> {
val itemDataSource = itemAPIService.getItems(userId).sortByDescTime()
val itemPagedList = LivePagedListBuilder(itemDataSource, 10).build()
return itemPagedList
}
Здесь вам нужно использовать MediatorLiveData. хотя код ниже находится на java, он должен служить основной цели. В вашей ViewModel добавьте оба
public LiveData<PagedList<Customer>> customerList;
public MediatorLiveData<PagedList<Customer>> customerListMediator;
затем сначала получите liveData, то есть customerList в моем случае
customerList = new LivePagedListBuilder<>(mAppRepository.getCustomers(new SimpleSQLiteQuery(dynamicQuery)),1).build();
после этого используйте mediatorLiveData:-
customerListMediator.addSource(customerList, new Observer<PagedList<Customer>>() {
@Override
public void onChanged(@Nullable PagedList<Customer> customers) {
customerListMediator.setValue(customers);
}
});
И в своем recyclerview не используйте список LiveData, вместо этого используйте mediatorLiveData, в моем случае customerListMediator. как показано ниже:-
mViewModel.customerListMediator.observe(this, customers -> {
mViewModel.customerListAdapter.submitList(customers);
Toast.makeText(this, "list updated.", Toast.LENGTH_SHORT).show();
});
Чтобы сохранить код в будущем, я использую возможность сортировки Room и Sql при использовании PagedList.
Что-то подобное:
Query("SELECT * FROM myItems WHERE X=Y ORDER BY :myItemField DESC") DataSource.Factory<Integer, ItemModel> getSortedItems(String myItemField)
Я признаю, что это не идеально, поскольку я не понимаю, почему нам нужно запрашивать наш DataSource для сортировки элементов, что является базовой операцией с памятью в Java. Это не совсем то, что я бы назвал дружественным к пользовательскому интерфейсу.
Очень хотелось бы узнать, есть ли у кого-то другой подход, чтобы сделать это без запроса источника данных. Также обратите внимание, что PagedList реализует java List.