我正在使用分页库。
目前,我想通过 PagedListAdapter 中的描述对项目进行排序(使用SortList),但我还没有弄清楚如何去做。
使用 PagedListAdapter 时如何对元素进行排序?谢谢你。
我也遇到了这个问题,并且很惊讶PagedList
似乎没有一种直接的方式来对项目进行排序。以下是我使用DataSource 实现所需效果的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 })
}
}
即,输入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
}
你需要在这里使用 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);
}
});
在您的回收站视图中,不要使用 LiveData 列表,而是使用 mediatorLiveData,在我的情况下为 customerListMediator。如下所示:-
mViewModel.customerListMediator.observe(this, customers -> {
mViewModel.customerListAdapter.submitList(customers);
Toast.makeText(this, "list updated.", Toast.LENGTH_SHORT).show();
});
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;
}
}
您可以注意到这里最重要的方法是: default DataSource.Factory<Integer, ItemEntity> getSortedProducts(SORT_OPT sortOptions)
您可以将排序值存储在 sharedPreferences 中并从那里加载。