官方示例https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSample
- 制作DataSource类
这里主要接受的数据为StatusBean ,
以下只作为示例,实际用的时候request是封装的
public class RepostDataSourse extends PageKeyedDataSource<Integer, StatusBean> {
public RepostDataSourse("传参") {
// 用构造函数传参
}
// 第一次呼叫的数据
@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull final LoadInitialCallback<Integer, StatusBean> callback) {
// 这里只做示例
// 构造请求
GsonRequest<RepostRes> gsonRequest = new GsonRequest<RepostRes>(
Request.Method.GET,
url,
RepostRes.class,
new Response.Listener<RepostRes>() {
@Override
public void onResponse(RepostRes response) {
// 主要是将数据返回给callback,null是上一页的page,2是下一页的page
callback.onResult(response.getData().getData(),null,2);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
Log.i("API","第一次转发请求");
queue.add(gsonRequest);
}
// 加载上一页
@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, StatusBean> callback) {
}
// 加载下一页
@Override
public void loadAfter(@NonNull final LoadParams<Integer> params, @NonNull final LoadCallback<Integer, StatusBean> callback) {
// 构造请求
GsonRequest<RepostRes> gsonRequest = new GsonRequest<RepostRes>(
Request.Method.GET,
url,
RepostRes.class,
new Response.Listener<RepostRes>() {
@Override
public void onResponse(RepostRes response) {
//一样,数据返回给callback
callback.onResult(response.getData().getData(),params.key+1);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
Log.i("API","转发请求,page:" + params.key);
queue.add(gsonRequest);
}
}
- 然后构造factory:
public class RepostDataSourseFactory extends DataSource.Factory<Integer, StatusBean> {
// 需要的参数放这
public RepostDataSourseFactory() {
构造函数传参
}
@NonNull
@Override
public DataSource<Integer, StatusBean> create() {
// 括号里传参
return new RepostDataSourse("传参");
}
}
- 使用,这的page是一次读取的信息条数,如果网络请求一次5个,这里设置18个,那么第一次请求就会连续请求4次,如果设置小于5个,那么只会请求一次
private LiveData<PagedList<StatusBean>> statusBeansPagedListLive ;
statusBeansPagedListLive = new LivePagedListBuilder<>(new RepostDataSourseFactory("传参"), PAGE).build();
- 然后对
statusBeansPagedListLive
观察就行
需要重新刷新可以用statusBeansPagedListLive.getValue().getDataSource().invalidate();
擦除所有数据
Adapter记得改成PagedListAdapter
,并且对getItem(position)
做null判断
- 如何获取DataSource内变量:
通过factory获取,一定要把RepostDataSourse声明为livedata
public class RepostDataSourseFactory extends DataSource.Factory<Integer, StatusBean> {
private RequestQueue queue;
private MutableLiveData<RepostDataSourse> repostDataSourseLive;
public RepostDataSourseFactory(RequestQueue queue) {
this.queue = queue;
this.repostDataSourseLive = new MutableLiveData<>();
}
public MutableLiveData<RepostDataSourse> getRepostDataSourseLive() {
return repostDataSourseLive;
}
@NonNull
@Override
public DataSource<Integer, StatusBean> create() {
repostDataSourseLive.postValue(new RepostDataSourse(queue));
return new RepostDataSourse(queue);
}
}
研究了一下很难添加复杂功能,这里推荐BRVAH
//www.greatytc.com/p/b343fcff51b0/