使用PagedListAdapter时对数组项进行排序吗?

时间:2018-07-13 08:29:13

标签: android-paging custom-paging

我正在使用Paging library

当前,我想按PagedListAdapter中的描述对项目进行排序(使用SortList),但是我还没有弄清楚该怎么做。

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

3 个答案:

答案 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 getSortedProducts(SORT_OPT sortOptions)

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