如何将 List 转换为 PagedList ,反之亦然?
2024-01-18

PagedList<Object>用于Android的酷分页库。为了使问题尽可能少: 如果我有一个字符串列表,例如

  List<String> stringList; // it consists of 200 strings

我想转换stringList输入PagedList<String> like

  PagedList<String> pagedStringList;

而且如果我有一个PagedList<Object>如何将其转换为List<Object>? 我经历了这个供参考 https://developer.android.com/topic/libraries/architecture/paging

如果我尝试相反的方式......

我怎样才能转换List<Object> into DataSource.Factory<Integer, Object>..这样我就可以间接地将其转换为PagedList<> ?

From DataSource.Factory<Integer, Object>我可以转换为PagedList<>但我怎样才能转换list into PagedList<> ?


我将从更简单的部分开始,如果您想将 PagedList 转换为 List 您可以使用snapshot()方法,正如您在码头中看到的,它返回:

返回 PagedList 当前状态的不可变快照。PagedList 快照只是 PagedList 当前状态作为 List 的不可变浅表副本。

现在,至于另一种方式,您需要使用 PagedList.Builder,为此您需要一个数据源来创建 PagedList。因此,管理静态列表的一个非常基本的数据源将如下所示:

字符串数据源.kt

class StringDataSource(val provider: StringListProvider) : PageKeyedDataSource<Int, String>() {
    override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, String>) {
        val list = provider.getStringList(0, params.requestedLoadSize)
        callback.onResult(list, 1, 2)
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, String>) {
        val list = provider.getStringList(params.key, params.requestedLoadSize)
        callback.onResult(list, params.key + 1)
    }

    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, String>) {
        val list = provider.getStringList(params.key, params.requestedLoadSize)
        val nextIndex = if (params.key > 1) params.key - 1 else null
        callback.onResult(list, nextIndex)
    }

    companion object {
        const val PAGE_SIZE = 20
    }
}

如您所见,您需要重写这三个方法loadInitial, loadAfter and loadBefore为了告诉数据源如何从列表中加载数据块。我已将您的列表包装在提供程序类中,只是出于组织目的。

StringListProvider.kt

class StringListProvider(val list: List<String>) {


    fun getStringList(page: Int, pageSize: Int): List<String> {

        val initialIndex = page * pageSize
        val finalIndex = initialIndex + pageSize
        //TODO manage index out of range
        return list.subList(initialIndex, finalIndex)
    }
}

要使用数据源生成 PagedList,您需要使用以下命令构建一个简单的配置PagedList.Config.Builder:

    val myConfig = PagedList.Config.Builder()
            .setInitialLoadSizeHint(PAGE_SIZE)
            .setPageSize(PAGE_SIZE)
            .build()

然后将其传递给PagedList.Builder与数据源:

    val pagedStrings: PagedList<String> = PagedList.Builder<Int, String>(StringDataSource(StringListProvider(originalStrings)), myConfig)
            .setInitialKey(0)
            .build()

现在你有一个PagedList了pagedStrings.

java中同样的事情:

StringListProvider.java

public class StringListProvider {

    private List<String> list;

    public StringListProvider(List<String> list) {
        this.list = list;
    }

    public List<String> getStringList(int page, int pageSize) {
        int initialIndex = page * pageSize;
        int finalIndex = initialIndex + pageSize;

        //TODO manage out of range index

        return list.subList(initialIndex, finalIndex);
    }
}

字符串数据源.java

public class StringDataSource extends PageKeyedDataSource<Integer, String> {

    public static final int PAGE_SIZE = 20;
    private StringListProvider provider;

    public StringDataSource(StringListProvider provider) {
        this.provider = provider;
    }

    @Override
    public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, String> callback) {
        List<String> result = provider.getStringList(0, params.requestedLoadSize);
        callback.onResult(result, 1, 2);
    }

    @Override
    public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, String> callback) {
        List<String> result = provider.getStringList(params.key, params.requestedLoadSize);
        Integer nextIndex = null;

        if (params.key > 1) {
            nextIndex = params.key - 1;
        }
        callback.onResult(result, nextIndex);
    }

    @Override
    public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, String> callback) {
        List<String> result = provider.getStringList(params.key, params.requestedLoadSize);
        callback.onResult(result, params.key + 1);
    }
}

配置生成

    PagedList.Config myConfig = new PagedList.Config.Builder()
            .setInitialLoadSizeHint(PAGE_SIZE)
            .setPageSize(PAGE_SIZE)
            .build();

列表转换

    List<String> myList = new ArrayList<>();
    StringListProvider provider = new StringListProvider(myList);
    StringDataSource dataSource = new StringDataSource(provider);
    PagedList<String> pagedStrings = new PagedList.Builder<Integer, String>(dataSource, myConfig)
            .setInitialKey(0)
            .build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 List 转换为 PagedList ,反之亦然? 的相关文章

随机推荐