web-dev-qa-db-fra.com

Comment convertir un objet <List> en un objet <PagingList> et inversement?

PagedList<Object> est utilisé pour la bibliothèque de radiomessagerie cool d'Android. Pour rendre la question aussi minime que possible: Si j'ai une liste de chaînes comme

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

Je veux convertir stringList à taper PagedList<String> comme

  PagedList<String> pagedStringList;

Et aussi, si j’ai un PagedList<Object>, comment le convertir en List<Object>? Je suis passé par ceci pour référence

Si j'essaie dans l'autre sens ...

Comment puis-je convertir List<Object> en DataSource.Factory<Integer, Object> .. alors qu'indirectement, je peux le convertir en PagedList<>?

De DataSource.Factory<Integer, Object> je peux convertir en PagedList<> mais comment puis-je convertir list en PagedList<>?

7
Santanu Sur

Je commencerai par la partie la plus facile. Si vous souhaitez convertir une liste PagedList <> en une liste <>, vous pouvez utiliser la méthode snapshot(), comme vous pouvez le constater dans les documents qu’elle renvoie:

Renvoie un instantané immuable de PagedList dans son état actuel. Un instantané PagedList est simplement une copie superficielle immuable de l'état actuel de PagedList en tant que liste. 

En ce qui concerne l’inverse, vous devrez utiliser PagedList.Builder et vous aurez besoin d’un DataSource pour créer PagedList. Ainsi, une source de données avery basic gérant votre liste statique ressemblerait à ceci:

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

Comme vous pouvez le constater, vous devez remplacer les trois méthodes loadInitial, loadAfter et loadBefore afin d'indiquer à la source de données comment charger les cunks de données de la liste. Je vous ai encapsulé dans une classe de fournisseur uniquement à des fins d'organisation.

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

Pour utiliser la source de données afin de générer la liste paginée, vous devez créer une configuration simple avec PagedList.Config.Builder:

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

Et passez ensuite cela au PagedList.Builder avec la source de données:

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

Vous avez maintenant une liste paginée dans pagedStrings.

La même chose en 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);
    }
}

Génération de configuration

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

Liste de conversion

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

Vous pouvez utiliser la méthode addAll puisqu’une PagedList est une AbstractList.

0
ncmathsadist