Android Paging (Java)

1. 介绍

主要功能:大数据的分页加载。
主要由三个部分组成:DataSource(数据源)、PageList(分页列表数据的容器)、PageListAdapter(是RecyclerView.Adapter的实现)。

2. 官方api

https://developer.android.google.cn/jetpack/androidx/releases/paging

依赖

dependencies {
  implementation "androidx.paging:paging-runtime:2.1.2" 
  testImplementation "androidx.paging:paging-common:2.1.2" 
  implementation "androidx.paging:paging-rxjava2:2.1.2" 
}

3. DataSource

3.1. DataSource<Key, Value>

PagedList加载的数据来自于DataSource。
有3个子类

  1. ItemKeyedDataSource<Key, Value>:从项目中使用的数据N-1来加载项 N,如从名称排序的数据库查询中查询下一个用户则需要前一个的名称和唯一ID。
  2. PageKeyedDataSource<Key, Value>:加载页面有相邻页的(key)来加载数据例如上一页、下一页。
  3. PositionalDataSource:在任意页面位置加载固定数量的数据。

3.2. DataSource.Factory<Key, Value>

DataSource的实现类需要通过Factory的方式去创建。

  1. 创建实体类

    public class F2DataBean {
        public String id;
        public String fraction;
        public ArrayList<Entry> data;
    }
    
  2. 后台线程的数据

    private List<F2DataBean > loadData(string id, String fraction) {
        List<F2DataBean> list = new ArrayList();
        for (int i = 0; i < 100; i++) {
            F2DataBean data = new F2DataBean();
            data.phone = id + i;
            data.fraction= "测试的内容=" + data.id;
            list.add(data);
        }
        return list;
    }
    
  3. 新加载数据时DataSource.Factory会再次创建一个新的DataSource提供实体类格式的新数据提供给PagedList

    public class F2DataSourceFactory extends F2DataSource.Factory<Integer, F2DataBean>{
        @Override
        public F2DataSource<Integer,F2DataBean> create() {
            return new F2DataSource<>();
        }
    }
    

3.3. ItemKeyedDataSource<Key, Value>

public class F2DataSource<I extends Number,F> extends ItemKeyedDataSource<Integer,F2DataBean> {

    @Override
    public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<F2DataBean> callback) {
       // 加载初始数据。
       //LoadParams:加载参数,包括加载后的密钥和请求的大小。
       callback.onResult(loadData("", 10),0,10);
    }

    @Override
    public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<F2DataBean> callback) {
	//在中指定的键之后加载列表数据LoadParams.key。	callback.onResult(loadData(params.key,params.requestedLoadSize));
    }

    @Override
    public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<F2DataBean> callback) {
    //在中指定的键之前加载列表数据LoadParams.key。
    
    }

    @NonNull
    @Override
    public Integer getKey(@NonNull F2DataBean item) {
    //返回与给定项目关联的键。
       return Integer.parseInt(item.phone);
    }
}

3.4. PageKeyedDataSource<Key, Value>

public class F2DataSource<I extends Number,F> extends PageKeyedDataSource<Integer,F2DataBean> {
    @Override
    public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, F2DataBean> callback) {
    // LoadParams:负载参数,包括新页面的键和请求的负载大小。
  // LoadCallback:接收已加载数据的回调。
        callback.onResult(loadData(0, 10),0,10);
    }

    @Override
    public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, F2DataBean> callback) {
       
    }

    @Override
    public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, F2DataBean> callback) {
   
       callback.onResult(loadData(params.startPosition, 10));
    }
}

3.5. PositionalDataSource

public class F2DataSource2<I extends Number,F> extends PositionalDataSource<F2DataBean> {
private int computeCount() {
     // actual count code here
 }

 private List<Item> loadRangeInternal(int startPosition, int loadCount) {
     // actual load code here
 }	
    @Override
    public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<F2DataBean> callback) {
    //参数传递给,包括页面大小和请求的start /
       // callback.onResult(loadRangeInternal(position,loadSize),position,totalCount);
 
    }

    @Override
    public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<F2DataBean> callback) {
//callback.onResult(loadRangeInternal(params.startPosition,params.loadSize));
 
    }
}

4. PagedList

PagedList是一种List,分页加载数据DataSource

//分页设置
         PagedList.Config config = new PagedList.Config.Builder()
                .setPageSize(10)                         //页面大小即每次加载时加载的数量
                .setEnablePlaceholders(false)     //配置是否启动PlaceHolders
                .setInitialLoadSizeHint(10)              //初始化加载的数量
                .build();

5. PageListAdapter

1.getCurrentList()返回适配器当前正在显示的PagedList。
2.getItemCount()返回适配器持有的数据集中的项目总数。
3.onCurrentListChanged(PagedList currentList)不建议使用此方法。请改用两个参数变体onCurrentListChanged(PagedList, PagedList)
4.onCurrentListChanged(PagedList previousList,PagedList currentList)在当前的PagedList更新时调用。
5.submitList(PagedList pagedList, Runnable commitCallback)设置要显示的新列表。
6.submitList(PagedList pagedList)设置要显示的新列表。
7.getItem(int position)获得项目id

//自定义ViewModel
F2PagingAdapter f2dapter = new F2PagingAdapter();
LivePagedListBuilder liveData = new LivePagedListBuilder(new F2DataSourceFactory(), config).build();
liveData.observe(this, new Observer<PagedList<F2DataBean>>() {
 	@Override
 	public void onChanged(@Nullable PagedList<F2DataBean> dataBeans) {
 		f2dapter.submitList(dataBeans);//刷新也可以用这个添加新数据
 	 }
  });


  RecyclerView mRecyclerView = view.findViewById(R.id.f2layout2);
  LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
  mRecyclerView.setLayoutManager(mLayoutManager);
  mRecyclerView.setAdapter(f2dapter);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值