JetPack--Paging快速上手

看了昨天的Paging推文是不是感觉什么SmartRefreshLayout?什么XRecyclerView?都可以统统抛掉了!

JetPack--Paging快速上手_第1张图片

但有些对JetPack及Kotlin接触不多的小伙伴却说:吹的挺牛!那么对API,根本没看懂!有木有!的确,入门的话,我们更需要一个简单的讲解。既然有这需求,哥哥我提着裤子,就发动了引擎!写下这篇快速上手的废话。幼儿园的车,走你!

JetPack--Paging快速上手_第2张图片

Paging都有什么?

相信看了昨天了文章,各位大佬都知道了Paging,主要通过4个模块实现了分页加载。分别是:

  • DataSource:拉取数据;
  • PagedList:从DataSource拿到数据后按Config规则,加载到PagedListAdapter;
  • PagedListAdapter:展示PagedList的数据;
  • UI:也就是界面。啦

手动插入官方那个[Paging框架数据流向图]。想不起了,就回顾回顾昨天的文章吧!温故而知新哦!

据说不贴上效果图,大家会以为你在吹牛X!没错!还是熟悉配方,郭霖婶婶的水果列表。

JetPack--Paging快速上手_第3张图片

Paging框架详解

DataSource

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

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();
    }
}

PagedListAdapter

别看名字是新人,其实我们和他是老相识了。它是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);
	}
};

UI

既然是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,你肯定知道它是干嘛的了。

你可能感兴趣的:(Android)