Я начну с более простой части: если вы хотите преобразовать 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();