Как преобразовать Список <Object>в PagedList <Object>и наоборот? - PullRequest
0 голосов
/ 25 апреля 2018

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<>, но как я могу преобразовать list в PagedList<>?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Я начну с более простой части: если вы хотите преобразовать PagedList <> в a List <>, вы можете использовать метод snapshot(), как вы можете видеть в документах, которые он возвращает:

Возвращает неизменный снимок PagedList в его текущем состоянии. Снимок PagedList представляет собой просто неизменяемую поверхностную копию текущего состояния PagedList в виде списка.

Теперь, как и в других случаях, вам нужно использовать PagedList.Builder, а для этого вам понадобится DataSource для создания PagedList.Таким образом, каждый базовый источник данных, который будет управлять вашим статическим списком, будет выглядеть так:

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

Как видите, вам нужно переопределить триметоды loadInitial, loadAfter и 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);
    }
}

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();
0 голосов
/ 25 апреля 2018

Вы можете использовать метод addAll, поскольку PagedList является AbstractList.

...