Сортировать элементы массива при использовании 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.

Другие вопросы по тегам