参考:

https://developer.android.google.cn/topic/libraries/architecture/paging/

文章目录

  • Concert
  • PagedListAdapter
  • ConcertDataSource
  • ConcertFactory
  • ConcertViewModel
  • MainActivity

Concert

public class Concert {    private String title;    private String content;    private String author;    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }    @Override    public boolean equals(Object obj) {        if (this == obj) {            return true;        }        if (obj == null) {            return false;        }        if (this.getClass() == obj.getClass()) {            return true;        }        Concert concert = (Concert) obj;        return Objects.equals(title, concert.title) && Objects.equals(content, concert.content) && Objects.equals(author, concert.author);    }    @Override    public int hashCode() {        return Objects.hash(title, content, author);    }}

PagedListAdapter

参考:
https://developer.android.google.cn/topic/libraries/architecture/paging/ui

这个Adapter就是一个RecyclerView的Adapter。

不过我们在使用paging实现RecyclerView的分页加载效果, 不能直接继承RecyclerView的Adapter,而是需要继承PagedListAdapter。

public class RecyclerAdapter extends PagedListAdapter<Concert, RecyclerAdapter.RecyclerViewHolder> {    protected RecyclerAdapter() {        super(DIFF_CALLBACK);    }    @NonNull    @Override    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false);        return new RecyclerViewHolder(view);    }    @Override    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {        Concert concert = getItem(position);        if (concert != null) {            holder.mTitleTextView.setText(concert.getTitle());            holder.mAuthorTextView.setText(concert.getAuthor());            holder.mContentTextView.setText(concert.getContent());        }    }    public static class RecyclerViewHolder extends RecyclerView.ViewHolder {        TextView mTitleTextView;        TextView mAuthorTextView;        TextView mContentTextView;        public RecyclerViewHolder(View itemView) {            super(itemView);            mTitleTextView = itemView.findViewById(R.id.title);            mAuthorTextView = itemView.findViewById(R.id.author);            mContentTextView = itemView.findViewById(R.id.content);        }    }    //需要oldConcert与新 newConcert 比较才能得出变化的数据    private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK =            new DiffUtil.ItemCallback<Concert>() {                // 判断Item是否已经存在                @Override                public boolean areItemsTheSame(Concert oldConcert, Concert newConcert) {                    return oldConcert.getTitle().equals(newConcert.getTitle());                }                // 如果Item已经存在则会调用此方法,判断Item的内容是否一致                @Override                public boolean areContentsTheSame(Concert oldConcert, Concert newConcert) {                    return oldConcert.equals(newConcert);                }            };}

ConcertDataSource

/** * DataSource:顾名思义,数据源,获取数据是通过它实现的。 * 官方文档上,实现的是ItemKeyedDataSource,而我这里实现的是PositionalDataSource */public class ConcertDataSource extends PositionalDataSource<Concert> {    /**     * 加载初始化数据,可以这么来理解,加载的是第一页的数据。     * 形象的说,当我们第一次打开页面,需要回调此方法来获取数据。     */    @Override    public void loadInitial(@NonNull LoadInitialParams params, @NonNull final LoadInitialCallback<Concert> callback) {        callback.onResult(fetchItems(0, 20), 0, 10000);    }    /**     * 当有了初始化数据之后,滑动的时候如果需要加载数据的话,会调用此方法。     */    @Override    public void loadRange(@NonNull LoadRangeParams params, @NonNull final LoadRangeCallback<Concert> callback) {        callback.onResult(fetchItems(params.startPosition, params.loadSize));    }    private List<Concert> fetchItems(int startPosition, int pageSize) {        List<Concert> list = new ArrayList<>();        for (int i = startPosition; i < startPosition + pageSize; i++) {            Concert concert = new Concert();            concert.setAuthor("author = " + i);            concert.setContent("content = " + i);            concert.setTitle("title = " + i);            list.add(concert);        }        return list;    }}

ConcertFactory

public class ConcertFactory extends DataSource.Factory<Integer, Concert> {    private MutableLiveData<ConcertDataSource> mSourceLiveData =            new MutableLiveData<>();    @Override    public DataSource<Integer, Concert> create() {        ConcertDataSource concertDataSource = new ConcertDataSource();        mSourceLiveData.postValue(concertDataSource);        return concertDataSource;    }}

ConcertViewModel

/** * PagedList: 数据源获取的数据最终靠PagedList来承载。 * 对于PagedList,我们可以这样来理解,它就是一页数据的集合。 * 每请求一页,就是新的一个PagedList对象。 */public class ConcertViewModel extends ViewModel {    private final LiveData<PagedList<Concert>> convertList;    private DataSource<Integer, Concert> concertDataSource;    public ConcertViewModel() {        ConcertFactory concertFactory = new ConcertFactory();        concertDataSource = concertFactory.create();        convertList = new LivePagedListBuilder<>(concertFactory, 20).build();    }    public void invalidateDataSource() {        concertDataSource.invalidate();    }    public LiveData<PagedList<Concert>> getConvertList() {        return convertList;    }}

MainActivity

public class MainActivity extends AppCompatActivity {    private RecyclerView mRecyclerView;    private RecyclerAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mRecyclerView = findViewById(R.id.recyclerView);        adapter = new RecyclerAdapter();        ConcertViewModel viewModel =                ViewModelProviders.of(this).get(ConcertViewModel.class);        //        viewModel.getConvertList().observe(this, concerts -> adapter.submitList(concerts));        viewModel.getConvertList().observe(this, new Observer<PagedList<Concert>>() {            @Override            public void onChanged(@Nullable PagedList<Concert> concerts) {                adapter.submitList(concerts);                Log.i("hongx","数据更新了");            }        });        mRecyclerView.setAdapter(adapter);        mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));    }}

Github:
https://github.com/345166018/HxJetpack/tree/master/HxPaging

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. mybatisplus的坑 insert标签insert into select无参数问题的解决
  3. python起点网月票榜字体反爬案例
  4. python list.sort()根据多个关键字排序的方法实现
  5. Android文件读写,保存数据
  6. android 多点触摸实现图片缩放
  7. Android下拉刷新,上拉加载
  8. android listView动态加载数据
  9. android之SimpleAdapter

随机推荐

  1. Android(安卓)设置DrawableRight和Drawab
  2. android:padding和android:margin的用法
  3. Android(安卓)TableLayout 实现边框
  4. Android的多媒体框架OpenCore介绍
  5. Android横竖屏切换实例总结
  6. Android中Activity四种启动模式详解
  7. android各个版本特性和市场占有率(2012年5
  8. Android进程间通信--消息机制及IPC机制实
  9. Android的底层库libutils介绍
  10. [置顶] Android官方文档系列(翻译)