Jetpack之Paging,2024年最新互联网公司面试问题大全及答案大全

  • @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 数据工厂

创建管理数据源的工厂,为什么有一个工厂,除了可以去创建数据源之外,为了后续的扩展

image-20200403103839064

/**

  • 数据的工厂
    */
    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对象。

image-20200403135908280

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的列表数据就改变了

image-20200403141250802

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

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值