Paging:分页库

Posted by alonealice on 2020-05-25

Paging是Google官方推出了一个新的分页组件。

添加依赖

1
2
3
implementation "android.arch.paging:runtime:1.0.1"
//Paging对RxJava2的原生支持
implementation "android.arch.paging:rxjava2:1.0.1"

使用

创建PageKeyedDataSource,用以获取数据源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class PagingDataSource extends PageKeyedDataSource<String, String> {

@Override
public void loadInitial(@NonNull LoadInitialParams<String> params, @NonNull LoadInitialCallback<String, String> callback) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("第"+i);
}
callback.onResult(list,0,2000,"","");
}

@Override
public void loadBefore(@NonNull LoadParams<String> params, @NonNull LoadCallback<String, String> callback) {

}

@Override
public void loadAfter(@NonNull LoadParams<String> params, @NonNull LoadCallback<String, String> callback) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("第"+i);
}
callback.onResult(list, "");
}
}

创建DataSource.Factory:

1
2
3
4
5
6
7
8
9
class PagingDataSourceFactory extends DataSource.Factory<String, String> {

@NonNull
@Override
public DataSource<String, String> create() {
PagingDataSource dataSource = new PagingDataSource();
return dataSource;
}
}

创建LivePagedListBuilder,用以绑定数据源和UI:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
textAdapter = new TextAdapter(new DiffUtil.ItemCallback<String>() {
@Override
public boolean areItemsTheSame(@NonNull String oldItem, @NonNull String newItem) {
return oldItem.equals(newItem);
}

@Override
public boolean areContentsTheSame(@NonNull String oldItem, @NonNull String newItem) {
return oldItem.equals(newItem);
}
});
recyclerView.setAdapter(textAdapter);
PagedList.Config config = new PagedList.Config.Builder()
.setInitialLoadSizeHint(20)//设置首次加载的数量
.setPageSize(20)//设置每页加载的数量
.setPrefetchDistance(2)//设置距离每页最后数据项来时预加载下一页数据
.build();
LiveData<PagedList<String>> build = new LivePagedListBuilder<>(factory, config).build();
build.observe(this, strings -> textAdapter.submitList(strings));

创建adpter:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TextAdapter extends PagedListAdapter<String, TextViewHolder> {

protected TextAdapter(@NonNull DiffUtil.ItemCallback<String> diffCallback) {
super(diffCallback);
}

@NonNull
@Override
public TextViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new TextViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_paging, parent, false));
}

@Override
public void onBindViewHolder(@NonNull TextViewHolder holder, int position) {
holder.textView.setText(getItem(position));
}
}