需求:强制刷新
方法一:
PullToRefreshListView本身提供了一个setRefreshing()接口,调用该接口会自动触发下拉刷新的操作(前提是支持下拉刷新)。按照一般的操作我们直接在onCreate或者Fragment的onCreateView中直接调用ptrLv.setRefreshing();然而效果并不如所愿,下来刷新时间没有触发,下拉视图也没出现,
原因:
在调用setRefreshing()之后要显示下拉的状态栏,也就是PullToRefreshBase(PullToRefreshListView的基类)中的mHeaderLayout并未测量完成。而只有mHeaderLayout为刷新结束即手放开的时候才会调用设定的onRefreshingListener()。这里有个小知识点View的measure操作和Activity的生命周期并不是同步的
完善的处理措施:
为PullToRefreshBase(PullToRefreshListView的父类)添加一个方法,该方法的思路是开启一个线程一直去循环检测mHeaderLayout是否测量完成
//在PullToRefreshBase中添加方法,也可以在PullToRefreshListView中添加,但在PullToRefreshListView中添加需要修改PullToRefreshBase.mHeaderLayout的访问权限为protected或者public(默认是private私有的,子类不能访问)
public void firstRefreshing(){
new AsyncTask<Integer,Void,Integer>(){ @Override protected void doInBackground(){Integer... params){ while(true){ if(mHeaderLayout.getHeight()>0) //已测量,则跳回到主线程执行postExecute() return null; SystemClock.sleep(200);//sleep一小段时间 } } @Override protected void postExecute(Integer i){ setRefreshing(true);//刷新 } } }
代码中直接引用的用法:
然后在onCreate中调用ptrLv.firstRefreshing()方法即可。
第二种方法能够保证刷新事件触发,因为刷新是在mHeaderLayout测量之后