Paging是Google官方推出了一个新的分页组件。
添加依赖
1 2 3
| implementation "android.arch.paging:runtime:1.0.1"
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)); } }
|