我正在使用Paging library。
当前,我想按PagedListAdapter中的描述对项目进行排序(使用SortList),但是我还没有弄清楚该怎么做。
使用PagedListAdapter时如何对元素排序? 谢谢。
答案 0 :(得分:0)
我也遇到了这个问题,令PagedList
似乎没有一种简单的方法来对项目进行排序感到惊讶。这是使用DataSource's mapByPage()
获得所需效果的方式:
/** 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 })
}
}
ie,mapByPage()
的输入应该是您的排序功能(取决于您的设置,我使用Kotlin扩展名和lambda语法对目标列表中的项目进行排序-使用Collections.sortedWith()
)>
然后,使用我在数据源上的扩展功能对获取的项目进行排序:
fun fetchItems(userId: Long): LiveData<PagedList<MyItem>> {
val itemDataSource = itemAPIService.getItems(userId).sortByDescTime()
val itemPagedList = LivePagedListBuilder(itemDataSource, 10).build()
return itemPagedList
}
答案 1 :(得分:0)
您需要在此处使用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();
});
答案 2 :(得分:0)
mapByPage() 函数可以工作,但有副作用,因为您需要“预先添加”PagedList 中的下一页项目才能获得所需的效果。
使用 Room @Dao 和 SQL 排序功能,你可以做这样的事情,它似乎更高效,因为它从 UI 组件中释放了排序操作:
@Dao
public interface MyItemDao{
enum SORT_OPT {
LABEL_ASC, LABEL_DESC, PRICE_ASC, PRICE_DESC, RATING_ASC, RATING_DESC
}
@Update
void update(ItemEntity itemEntity);
@Delete
void delete(ItemEntity itemEntity);
@Query("DELETE FROM item_table")
void deleteAll();
@Query("SELECT * FROM item_table ORDER BY price ASC")
@Transaction
DataSource.Factory<Integer, ItemEntity> getProductsOrderByPriceAsc();
@Query("SELECT * FROM item_table ORDER BY price DESC")
@Transaction
DataSource.Factory<Integer, ItemEntity> getProductsOrderByPriceDesc();
@Query("SELECT * FROM item_table ORDER BY label ASC")
@Transaction
DataSource.Factory<Integer, ItemEntity> getProductsOrderByLabelAsc();
@Query("SELECT * FROM item_table ORDER BY label DESC")
@Transaction
DataSource.Factory<Integer, ItemEntity> getProductsOrderByLabelDesc();
@Query("SELECT * FROM product_table ORDER BY totalRating ASC")
@Transaction
DataSource.Factory<Integer, ItemEntity> getProductsOrderByRatingAsc();
@Query("SELECT * FROM product_table ORDER BY totalRating DESC")
@Transaction
DataSource.Factory<Integer, ItemEntity> getProductsOrderByRatingDesc();
default DataSource.Factory<Integer, ItemEntity> getSortedProducts(SORT_OPT sortOptions) {
switch (sortOptions) {
case LABEL_ASC:
return getProductsOrderByLabelAsc();
case LABEL_DESC:
return getProductsOrderByLabelDesc();
case PRICE_ASC:
return getProductsOrderByPriceAsc();
case PRICE_DESC:
return getProductsOrderByPriceDesc();
case RATING_ASC:
return getProductsOrderByRatingAsc();
case RATING_DESC:
return getProductsOrderByRatingDesc();
default:
return null;
}
}
正如您所注意到的,这里最重要的方法是:
默认 DataSource.Factory
您可以将排序值存储在 sharedPreferences 中并从那里加载。