- @param callback
*/
@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback callback) {
// @1 从哪里开始加载(位置 内部算的) @2 size(size 内部算的)
callback.onResult(getStudents(params.startPosition, params.loadSize));
}
/**
- 可以理解这里是数据源,数据的来源(数据库,文件,网络服务器响应 等等)
- @param startPosition
- @param pageSize
- @return
*/
private List getStudents(int startPosition, int pageSize) {
List list = new ArrayList<>();
for (int i = startPosition; i < startPosition + pageSize; i++) {
Student student = new Student();
student.setId(“ID号是:” + i);
student.setName(“我名称:” + i);
student.setSex(“我性别:” + i);
list.add(student);
}
return list;
}
}
角色2 数据工厂
创建管理数据源的工厂,为什么有一个工厂,除了可以去创建数据源之外,为了后续的扩展
/**
- 数据的工厂
*/
public class StudentDataSourceFactory extends DataSource.Factory<Integer, Student> {
@NonNull
@Override
public DataSource<Integer, Student> create() {
StudentDataSource studentDataSource = new StudentDataSource();
return studentDataSource;
}
}
角色3 数据模型
数据模型其实就是 ViewModel,用来管理数据
PagedList: 数据源获取的数据最终靠PagedList来承载。对于PagedList,我们可以这样来理解,它就是一页数据的集合。 每请求一页,就是新的一个PagedList对象。
public class StudentViewModel extends ViewModel {
// 看源码:@1 listLiveData 数据怎么来的
private final LiveData<PagedList> listLiveData;
public StudentViewModel() {
StudentDataSourceFactory factory = new StudentDataSourceFactory();
// 初始化 ViewModel
this.listLiveData = new LivePagedListBuilder<Integer, Student>(factory, Flag.SIZE).build();
}
// TODO 暴露数据出去
public LiveData<PagedList> getListLiveData() {
return listLiveData;
}
}
角色4 适配器
这个Adapter就是一个RecyclerView的Adapter。不过我们在使用paging实现RecyclerView的分页加载效果,不能直接继承RecyclerView的Adapter,而是需要继承PagedListAdapter。
LiveData观察到的数据,把感应到的数据给适配器,适配器又绑定了 RecyclerView,那么RecyclerView的列表数据就改变了
public class RecyclerPagingAdapter extends PagedListAdapter<Student, RecyclerPagingAdapter.MyRecyclerViewHolder> {
// TODO 比较的行为
private static DiffUtil.ItemCallback DIFF_STUDNET = new
DiffUtil.ItemCallback() {
// 一般是比较 唯一性的内容, ID
@Override
public boolean areItemsTheSame(@NonNull Student oldItem, @NonNull Student newItem) {
return oldItem.getId().equals(newItem.getId());
}
// 对象本身的比较
@Override
public boolean areContentsTheSame(@NonNull Student oldItem, @NonNull Student newItem) {
return oldItem.equals(newItem);
}
};
protected RecyclerPagingAdapter() {
super(DIFF_STUDNET);
}
@NonNull
@Override
public MyRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null);
return new MyRecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyRecyclerViewHolder holder, int position) {
Student student = getItem(position);
// item view 出来了, 分页库还在加载数据中,我就显示 Id加载中
if (null == student) {
holder.tvId.setText(“Id加载中”);
holder.tvName.setText(“Name加载中”);
holder.tvSex.setText(“Sex加载中”);
} else {
holder.tvId.setText(student.getId());
holder.tvName.setText(student.getName());
holder.tvSex.setText(student.getSex());
}
}
// Item 优化的 ViewHolder
public static class MyRecyclerViewHolder ex