Android开发笔记(二十七)Paging实现加载更多

官方示例https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSample

  1. 制作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);
    }
}
  1. 然后构造factory:
public class RepostDataSourseFactory extends DataSource.Factory<Integer, StatusBean> {
  // 需要的参数放这

    public RepostDataSourseFactory() {
        构造函数传参
    }

    @NonNull
    @Override
    public DataSource<Integer, StatusBean> create() {
      // 括号里传参
        return new RepostDataSourse("传参");
    }
}
  1. 使用,这的page是一次读取的信息条数,如果网络请求一次5个,这里设置18个,那么第一次请求就会连续请求4次,如果设置小于5个,那么只会请求一次
    private LiveData<PagedList<StatusBean>> statusBeansPagedListLive ;
    statusBeansPagedListLive = new LivePagedListBuilder<>(new RepostDataSourseFactory("传参"), PAGE).build();
  1. 然后对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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。