PullToRefreshListView实现下拉刷新

来源:互联网 发布:大数据技术起源行业 编辑:程序博客网 时间:2024/05/16 19:32

首先我们需要理解PullToRefreshListView是一个竖直的LinearLayout

具体的样式大致可以分为三部分,如下图


图中的mRefreshableView是一个listview,我们都知道,如果一个listview,那么他本身是可以有一个headview和footview的,也就是这个又可以具体分为下面这样:


下面我们来分析具体的场景:

1.正常状态下手指没有触碰屏幕时;

2.屏幕下拉,显示松开刷新时;

3.手指松开为刷新状态时;


1.首先未触碰手机屏幕时,我们以红色框代表手机屏幕,显示时的布局为:


那么是怎么使边距刚好只显示mRefreshView且与mRefreshView的上边距对齐的呢?

只要知道mHeadLayout的高度就可以,然后通过设置整个布局的padding即可;

下面我简单解释一下padding

如果一个布局的paddingTop设置为大于0的值,那么:


如果一个布局的paddingTop设置为等于0的值,那么:


如果一个布局的paddingTop设置为小于0,那么:


所以只要知道mHeadLayout的高度mHeadHeight和mFooterLayout的高度mFootHeight,在设置上下边距的时候,设置上边距为-mHeadHeight,下边距为mFootHeight即可,

且此处的mHeadLayout的高度是一个相对较大的定值,所以整个mHeadLayout中底部是一个LoadingLayout,结构图如下:


mHeadHeight是框架给我设定的一个较大的值;


2,接下来说一下,随着手指在屏幕上下拉的时候,实际做了哪些操作?

既然是一个LinearLayout,且整体布局大小是大于屏幕大小,那么手指下拉的过程,就是整个linearlayout布局向下滚动的过程;

随之手指滚动的距离,scrollto相应的距离;

其中需要关注的代码无非就是onItercepterEvent来解决和内部listview的滑动冲突

另一个是OnTouchEvent随着手指滑动,整个LinearLayout的滚动;

向下滚动的过程中,mHeadLayout逐渐显示出来,被看见;


3.松开后刷新界面又是如何实现的,松开后,整个布局又回到了一开始的状态,


即只显示mRefreshableView,那么为什么还会显示一个刷新按钮呢,就是因为,和第一个状态下不同的是,listview内部的headview显示出来了,而这个headview也是一个loadingLayout,且整体样式和mHeaderLayout中的loadingLayout一致;且刷新完成后,listview中的headview又被隐藏起来了,回复到第一种状态;


所以看似复杂的PullToRefreshListView,其实只有两个状态;

1.整个布局随着手指滑动而向下滚动

2.整个布局中的mRefreshableView和屏幕相切,显示listview内部的headview即为刷新状态,不显示时即为常态





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