首页 > 学院 > 开发设计 > 正文

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

2019-11-08 00:34:55
字体:
来源:转载
供稿:网友

今天要介绍的是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部分先讲到这里, 下一篇会讲网络部分.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表