1. 介绍
主要功能:大数据的分页加载。
主要由三个部分组成:DataSource(数据源)、PageList(分页列表数据的容器)、PageListAdapter(是RecyclerView.Adapter的实现)。
2. 官方api
https://developer.android.google.cn/jetpack/androidx/releases/paging
依赖
dependencies {
implementation "androidx.paging:paging-runtime:2.1.2"
testImplementation "androidx.paging:paging-common:2.1.2"
implementation "androidx.paging:paging-rxjava2:2.1.2"
}
3. DataSource
3.1. DataSource<Key, Value>
PagedList加载的数据来自于DataSource。
有3个子类
- ItemKeyedDataSource<Key, Value>:从项目中使用的数据N-1来加载项 N,如从名称排序的数据库查询中查询下一个用户则需要前一个的名称和唯一ID。
- PageKeyedDataSource<Key, Value>:加载页面有相邻页的(key)来加载数据例如上一页、下一页。
- PositionalDataSource:在任意页面位置加载固定数量的数据。
3.2. DataSource.Factory<Key, Value>
DataSource的实现类需要通过Factory的方式去创建。
-
创建实体类
public class F2DataBean { public String id; public String fraction; public ArrayList<Entry> data; }
-
后台线程的数据
private List<F2DataBean > loadData(string id, String fraction) { List<F2DataBean> list = new ArrayList(); for (int i = 0; i < 100; i++) { F2DataBean data = new F2DataBean(); data.phone = id + i; data.fraction= "测试的内容=" + data.id; list.add(data); } return list; }
-
新加载数据时DataSource.Factory会再次创建一个新的DataSource提供实体类格式的新数据提供给PagedList
public class F2DataSourceFactory extends F2DataSource.Factory<Integer, F2DataBean>{ @Override public F2DataSource<Integer,F2DataBean> create() { return new F2DataSource<>(); } }
3.3. ItemKeyedDataSource<Key, Value>
public class F2DataSource<I extends Number,F> extends ItemKeyedDataSource<Integer,F2DataBean> {
@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<F2DataBean> callback) {
// 加载初始数据。
//LoadParams:加载参数,包括加载后的密钥和请求的大小。
callback.onResult(loadData("", 10),0,10);
}
@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<F2DataBean> callback) {
//在中指定的键之后加载列表数据LoadParams.key。 callback.onResult(loadData(params.key,params.requestedLoadSize));
}
@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<F2DataBean> callback) {
//在中指定的键之前加载列表数据LoadParams.key。
}
@NonNull
@Override
public Integer getKey(@NonNull F2DataBean item) {
//返回与给定项目关联的键。
return Integer.parseInt(item.phone);
}
}
3.4. PageKeyedDataSource<Key, Value>
public class F2DataSource<I extends Number,F> extends PageKeyedDataSource<Integer,F2DataBean> {
@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, F2DataBean> callback) {
// LoadParams:负载参数,包括新页面的键和请求的负载大小。
// LoadCallback:接收已加载数据的回调。
callback.onResult(loadData(0, 10),0,10);
}
@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, F2DataBean> callback) {
}
@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, F2DataBean> callback) {
callback.onResult(loadData(params.startPosition, 10));
}
}
3.5. PositionalDataSource
public class F2DataSource2<I extends Number,F> extends PositionalDataSource<F2DataBean> {
private int computeCount() {
// actual count code here
}
private List<Item> loadRangeInternal(int startPosition, int loadCount) {
// actual load code here
}
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<F2DataBean> callback) {
//参数传递给,包括页面大小和请求的start /
// callback.onResult(loadRangeInternal(position,loadSize),position,totalCount);
}
@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<F2DataBean> callback) {
//callback.onResult(loadRangeInternal(params.startPosition,params.loadSize));
}
}
4. PagedList
PagedList是一种List,分页加载数据DataSource
//分页设置
PagedList.Config config = new PagedList.Config.Builder()
.setPageSize(10) //页面大小即每次加载时加载的数量
.setEnablePlaceholders(false) //配置是否启动PlaceHolders
.setInitialLoadSizeHint(10) //初始化加载的数量
.build();
5. PageListAdapter
1.getCurrentList()返回适配器当前正在显示的PagedList。
2.getItemCount()返回适配器持有的数据集中的项目总数。
3.onCurrentListChanged(PagedList currentList)不建议使用此方法。请改用两个参数变体onCurrentListChanged(PagedList, PagedList)
4.onCurrentListChanged(PagedList previousList,PagedList currentList)在当前的PagedList更新时调用。
5.submitList(PagedList pagedList, Runnable commitCallback)设置要显示的新列表。
6.submitList(PagedList pagedList)设置要显示的新列表。
7.getItem(int position)获得项目id
//自定义ViewModel
F2PagingAdapter f2dapter = new F2PagingAdapter();
LivePagedListBuilder liveData = new LivePagedListBuilder(new F2DataSourceFactory(), config).build();
liveData.observe(this, new Observer<PagedList<F2DataBean>>() {
@Override
public void onChanged(@Nullable PagedList<F2DataBean> dataBeans) {
f2dapter.submitList(dataBeans);//刷新也可以用这个添加新数据
}
});
RecyclerView mRecyclerView = view.findViewById(R.id.f2layout2);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(f2dapter);