Fragment系列(三)------RecyclerFragment之UI部分

来源:互联网 发布:网络监控网线传输距离 编辑:程序博客网 时间:2024/05/22 17:42

今天要介绍的是github上一个Android开源框架: android-starter-kit (Rx部分)

链接: https://github.com/qijitech/android-starter-kit

Fragment系列:
(一)View与Presenter
(二)NetworkFragment
(三)RecyclerFragment之UI部分

今天来讲讲 StarterRecyclerFragment
(用到了EasyRecyclerAdapter, 不熟悉的可以看看这篇文章)
先看定义:

public abstract class StarterRecyclerFragment<E extends Entity, PC extends PaginatorPresenter>    extends StarterNetworkFragment<PaginatorContract<E>, PC>    implements com.paginate.Paginate.Callbacks,    SwipeRefreshLayout.OnRefreshListener

Entity相当于model层, PaginatorPresenter是一个处理分页加载的presenterr, 而PaginatorContract其实是对获取到的数据进行一个封装.

这个fragment的布局非常简单, 最外层FrameLayout, 里面是SwipeRefreshLayout, 最后是RecyclerView.

往下之前, 我想简单讲讲分页加载是个什么东西(知道的同学可以跳过)
这个fragment支持2种分页方式, 第一种是通过page
举个栗子, 客户端向服务器发送一个请求, 请求第1页的数据, 然后服务器返回数据;
之后客户端想加载第2页, 就会再向服务器请求第2页, 就这样3,4,5,6页……..下去.
当某一次, 服务器返回空, 那就说明全部数据已经给你了.
再说说第2种: 通过id
服务器会返回以id排序的一部分数据, 然后客户端可以把最后一个数据的id发给服务器, 请求这个id之后的更多数据.
这样直到服务器返回空, 就说明全部数据已经给你了.

继续看fragment
这里用到了一个类StarterFragConfig, 这个类就是用来存放一些配置信息.
例如recyclerView用什么layout, swipeRefreshLayout什么颜色, 用哪种分页方式等等. 感兴趣可以进入源码看看.
现在顺着生命周期看看

onCreate

构造了一个EasyRecyclerAdapter
根据建议, 开发者在这里应该调用buildFragConfig方法, 参数为StarterFragConfig, 建议通过builder构造.
buildFragConfig方法会配置recyclerViewAdapter的viewHolderFactory和bind, 然后把StarterFragConfig保存起来.
(后面为了方便, StarterFragConfig简称fragConfig)

onViewCreated

一, 找到swipeRefreshLayout和RecyclerView
二, 初始化RecyclerView, 就是通过fragConfig设置layoutManager等等
三, 这里通过一个叫Paginate的类, 来配置recyclerView的上拉加载更多.
首先判读fragConfig的canAddLoadingListItem
(canAddLoadingListItem就是指需要加载更多的时候,要不要显示一个进度)
如果为false, 跳过这一步.
用到了RecyclerPaginate类

RecyclerPaginate

先看内部变量:

private final RecyclerView recyclerView;   //要处理的recyclerViewprivate final Callbacks callbacks;       //这个接口包含3个方法, onLoadMore ,isLoading, hasLoadedAllItems, 这3个方法的实现都写在StarterRecyclerFragmentprivate final int loadingTriggerThreshold;  //设置当底部还剩多少个没有显示出来的时候, 开始加载更多. 可以实现预加载private WrapperAdapter wrapperAdapter;      //后面介绍private WrapperSpanSizeLookup wrapperSpanSizeLookup;  //后面介绍

RecyclerPaginate构造过程:
1: recyclerView.addOnScrollListener(mOnScrollListener)
每一次滑动都会判断是否到达底部, 若到达底部, 再看是否正在刷新或者已经加载全部item,
注意: recyclerView的layoutManager只能是linear或staggerGrid
2: 如果canAddLoadingListItem为false, 跳过. 这一步配置加载更多的进度图的viewHolder.
WrapperAdapter继承RecyclerView.Adapter, 构造时候要传入原recyclerView的adapter和LoadingListItemCreator.
这个LoadingListItemCreator是个接口, 只有2个方法:

RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType);
void onBindViewHolder(RecyclerView.ViewHolder holder, int position);

还提供了一个默认实现.
这个wrapperAdapter实际上可以实现2种viewType, 当要显示正常viewType的时候, 调用原adapter; 要显示进度圈, 就调用LoadingListItemCreator.
3: 最后检查一下,现在的位置是否需要加载更多. 现在RecyclerPaginate构造结束.

回到onViewCreated
然后初始化swipeRefreshLayout
通过fragConfig设置ColorSchemeColors, 然后设置OnRefreshListener.
onRefresh()的操作比较简单, 还没refresh就开网络请求; 已经开了,就显示圈圈.
最后如果fragConfig有初始数据, 就add到adapter里面.

UI部分先讲到这里, 下一篇会讲网络部分.

阅读全文
0 0
原创粉丝点击