7

我正在使用分页库

目前,我想通过 PagedListAdapter 中的描述对项目进行排序(使用SortList),但我还没有弄清楚如何去做。

使用 PagedListAdapter 时如何对元素进行排序?谢谢你。

4

3 回答 3

6

我也遇到了这个问题,并且很惊讶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
}
于 2019-06-20T13:18:53.653 回答
1

你需要在这里使用 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();
    });
于 2020-09-19T04:42:32.553 回答
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;
        }
    }

您可以注意到这里最重要的方法是: default DataSource.Factory<Integer, ItemEntity> getSortedProducts(SORT_OPT sortOptions)

您可以将排序值存储在 sharedPreferences 中并从那里加载。

于 2021-02-22T12:34:50.220 回答