web-dev-qa-db-ja.com

List <Object>をPagedList <Object>に、またはその逆に変換する方法は?

PagedList<Object>は、Androidのクールなページングライブラリに使用されます。質問をできる限り最小限にするには:次のような文字列のリストがある場合

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

stringListをタイプPagedList<String>に変換したい

  PagedList<String> pagedStringList;

また、PagedList<Object>がある場合、どのようにList<Object>に変換できますか? 参照用 を通過しました

私が逆方向に試してみると....

List<Object>DataSource.Factory<Integer, Object>に変換するにはどうすればよいですか?間接的にPagedList<>に変換できるようにするには?

DataSource.Factory<Integer, Object>からPagedList<>に変換できますが、どのようにしてlistPagedList<>に変換できますか?

15
Santanu Sur

簡単な部分から始めましょう。PagedList<>をList <>に変換したい場合、snapshot()メソッドを使用できます。

現在の状態のPagedListの不変のスナップショットを返します。Pag​​edListのスナップショットは、ListとしてのPagedListの現在の状態の不変の浅いコピーです。

ここで、他の方法については、PagedList.Builderを使用する必要があり、そのためには、PagedListを作成するためのDataSourceが必要になります。したがって、静的リストを管理する非常に基本的なdataSourceは次のようになります。

StringDataSource.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
    }
}

ご覧のとおり、リストからデータの塊をロードする方法をデータソースに伝えるには、3つのメソッドloadInitialloadAfter、および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()

これで、pagedStringsにPagedListができました。

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);
    }
}

StringDataSource.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();
7
Levi Moreira

addAllPagedListであるため、メソッドAbstractListを使用できます。

0
ncmathsadist