功能简介
1.下拉刷新,包含两种样式。一种为普通的下拉,如图下拉刷新_普通.gif:
第二种为类饿了吗下拉刷新,如图下拉刷新_仿饿了吗.gif:
2.上拉加载。如图上拉加载.gif:
详解
读前须知
1.读者可以参考项目代码阅读下文
2.View相关方法执行顺序:onFinishInflate()->onMeasure()->onSizeChanged()->onLayout->onDraw()->computeScroll()
下拉刷新
基本原理
重写LinearLayout(下拉刷新普通)或者FrameLayout(下拉刷新仿饿了吗),在ListView上添加一个刷新头,根据下拉距离来更新刷新头显示效果。
四种状态
1.刷新完成或未刷新状态,同时也是初始状态;
2.下拉状态,此时处于下拉动作下,刷新头已经展示出来。如果这时松手,可能返回初始状态,也可能触发刷新,取决于其下拉距离;
3.释放立即刷新状态,说明此时下拉距离已经足够,松手即会触发刷新事件;
4.正在刷新状态,触发刷新事件,且处于该状态时不会重复触发刷新事件。
核心代码:监听OnTouchListener逻辑流程图如下:
上拉加载
基本原理
重写ListView,添加一个用于显示加载更多的footerView,根据状态来更新显示效果。
四种状态
1.加载完成或未加载状态,同时也是处是状态;
2.加载中状态,此时触发加载事件;
3.没有更多数据状态,此时footerView会提示用户“没有更多数据了”;
4.加载出错,此时footerView会提示用户“加载出错”。
坑点
1.OnScrollListener中的public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)方法。firstVisibleItem为第一个可见的item的position,visibleItemCount为当前可见item的数量,totalItemCount为所有item的个数(包括header和footer)。那如果我想获得当前可见的最后一个item该怎么获取呢?getChildAt(firstVisibleItem + visibleItemCount -1)?肯定报IndexOutOfBoundException,为什么越界呢,因为ListView根本没有那么多child,这主要跟ListView的回收机制有关,其实它只有visibleItemCount的child,所以只要getChildAt(visibleItemCount - 1)即可。