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<>
に変換できますか?
簡単な部分から始めましょう。PagedList<>をList <>に変換したい場合、snapshot()
メソッドを使用できます。
現在の状態のPagedListの不変のスナップショットを返します。PagedListのスナップショットは、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つのメソッド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()
これで、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();
addAll
はPagedList
であるため、メソッドAbstractList
を使用できます。