1,自定义下拉刷新-添加头布局
参考ui
1.1,下拉刷新实际上是一个View,添加到ListView头布局上的控件
创建对应的布局文件
1.2,创建一个自定义控件PullToRefreshListView
创建方法initHeaderView()//初始化头布局控件
注意:头布局的添加顺序:先添加的在上面
1.3,隐藏头布局
设置头布局的padding为自身的(-高度)
获取高度的时候,记得先手动测量一下
1.4,拉出头布局
重写触摸事件,记录按下的位置(downX),和移动的位置,两者相减
但是这里要注意,ViewPager头条新闻可能会消费掉按下的位置,导致按下的位置(downX)没有赋值,所以在移动的事件判断中(要给downX重新赋值)
下拉的时候,判断如果是一个条目,或移动的值为正数才能拉出头布局
然后动态的修改padding(移动的值 - 高度);
1.5 头布局状态切换
定义一个枚举表示这三个状态
下拉刷新:
默认状态,当padding 小于0的时候显示,并且当前不处于正在刷新
松开刷新
当padding大于0,并且上一个状态处于下拉刷新进入
正在刷新
松开事件中,如果处于松开刷新时进入.
定义一个方法,当状态发生改变的时候调用
观察可知,状态文字,时间,箭头发生了改变
箭头动画由↓逆时针180度↑,记得保持最后的状态
当松手之后,如果为刷新状态:修改头布局padding为0,完整展示,显示进度条,隐藏箭头(记得把动画清理掉,否则不能隐藏)否则隐藏头布局
细节:如果处于正在刷新,再次拖拽的时候不应该进入判断,break跳出循环
1.6 接口回调
哪里需要通知调用者,就在哪里进行调用接口方法
要提供一个方法给外界设置回调监听器
调用者在回调的方法里再次访问网络解析数据
自定义控件中提供一个方法,让调用者调用
同时调用自定义控件的方法,告诉自定义控件刷新结束了(网络请求失败的时候也要调用一下)
1.7 时间更新
创建一个设置时间的方法,让调用者调用(不在自定义控件中更新,是因为网络请求可能失败,失败的话,是不需要更新时间的,)
当然,也可以写在刷新的方法里,传递一个参数进来,判断是否成功请求网络
MM月 如果是小写 就是从0开始的
HH 小时 24进制,hh 12进制
初次显示的时间,可以按需求来,是否需要保存在本地(只显示成功请求的时间之类的)
1.8 Xutils细节补充
①Xutils访问网络不需要创建子线程,因为它底层用的是AsyncTask
②Xutils的回调方法里可以更新ui,因为回调方法实际上是在handler里进行的,已经在主线程中运行了.就不用担心更新ui的问题.底层是异步的