Android(安卓)Jetpack-Paging使用
16lz
2021-12-04
参考:
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
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- python起点网月票榜字体反爬案例
- python list.sort()根据多个关键字排序的方法实现
- Android文件读写,保存数据
- android 多点触摸实现图片缩放
- Android下拉刷新,上拉加载
- android listView动态加载数据
- android之SimpleAdapter