看了昨天的Paging推文是不是感觉什么SmartRefreshLayout?什么XRecyclerView?都可以统统抛掉了!
但有些对JetPack及Kotlin接触不多的小伙伴却说:吹的挺牛!那么对API,根本没看懂!有木有!的确,入门的话,我们更需要一个简单的讲解。既然有这需求,哥哥我提着裤子,就发动了引擎!写下这篇快速上手的废话。幼儿园的车,走你!
相信看了昨天了文章,各位大佬都知道了Paging,主要通过4个模块实现了分页加载。分别是:
手动插入官方那个[Paging框架数据流向图]。想不起了,就回顾回顾昨天的文章吧!温故而知新哦!
据说不贴上效果图,大家会以为你在吹牛X!没错!还是熟悉配方,郭霖婶婶的水果列表。
DataSource主要有三种实现,今天咱们以PositionalDataSource举例。继承之后主要覆写:初始化时加载内容的loadInitial()和加载指定范围数据的loadRange()。
@Override
public void loadInitial(@NonNull LoadInitialParams params,
final @NonNull LoadInitialCallback<FruitBean> callback) {
final int startPosition = 0;
List<FruitBean> list = buildDataList(startPosition, params.requestedLoadSize);
//将数据回调
callback.onResult(list, 0);
}
@Override
public void loadRange(@NonNull final LoadRangeParams params,
@NonNull final LoadRangeCallback<FruitBean> callback) {
List<FruitBean> list = buildDataList(params.startPosition, params.loadSize);
callback.onResult(list);
}
DataSourceFactory主要利用了MutableLiveData实现数据的动态更新,不展开。感兴趣的去找隔壁王大娘:LiveData。
PagedList主要有两个重点。一个是配置从Datasource 加载数据的方式的PagedList.Config;数据刷新方法:invalidateDataSource()。
private PagedList.Config myPagingConfig = new PagedList.Config.Builder()
.setInitialLoadSizeHint(20)//设置首次加载的数量;
.setPageSize(10)//设置每一页加载的数量;
.setPrefetchDistance(10)//设置距离最后还有多少个item时加载下一页;
.setEnablePlaceholders(false)//表示是否设置null占位符;
.build();
public void invalidateDataSource() {
PagedList<FruitBean> pagedList = concertList.getValue();
if (pagedList != null){
pagedList.getDataSource().invalidate();
}
}
别看名字是新人,其实我们和他是老相识了。它是RecyclerView.Adapter的子类,你说熟不熟?不同一点就是:需要创建DiffUtil.ItemCallback,并在构造方法中指定。此对象主要进行数据的比较。
public FruitAdapter(Context context) {
super(DIFF_CALLBACK);
this.context = context;
}
private static DiffUtil.ItemCallback<FruitBean> DIFF_CALLBACK =
new DiffUtil.ItemCallback<FruitBean>() {
@Override
public boolean areItemsTheSame(FruitBean oldItem, FruitBean newItem) {
return oldItem.getId() == newItem.getId();
}
@Override
public boolean areContentsTheSame(FruitBean oldItem, @NonNull FruitBean newItem) {
return oldItem.equals(newItem);
}
};
既然是RecyclerView,指定LayoutManager、ItemDecoration、setAdapter肯定少不了。需要额外做的就是将数据源订阅到观察者。
mViewModel.getConcertList().observe(this, new Observer<PagedList<FruitBean>>() {
@Override
public void onChanged(@Nullable PagedList<FruitBean> dataBeans) {
mAdapter.submitList(mViewModel.getConcertList().getValue());
}
});
上面我们就以一种简单的方式用Paging实现了分页加载。代码我给小主们都准备好了,去码云,clone下来跑一跑吧。
最后,再回顾一下Paging的机制主要有4点:1.DataSource,拉取数据;2.PagedList从DataSource拿到数据加载到PagedListAdapter;3.PagedListAdapter,展示PagedList的数据到UI;4.UI,你肯定知道它是干嘛的了。