Android——PullToRefresh自动刷新

现在有一个这样的需求,在Activity的onCreate函数中或者在Fragment的onCreateView函数中让PullToRefreshListView自动刷新进行网络数据的请求,PullToRefreshListView本身提供了一个setRefreshing()接口,调用该接口会自动触发下拉刷新的操作(前提是支持下拉刷新)。按照一般的操作我们直接在onCreate或者Fragment的onCreateView中直接调用ptrLv.setRefreshing();然而效果并不如所愿,下来刷新时间没有触发,下拉视图也没出现,原因:在调用setRefreshing()之后要显示下拉的状态栏,也就是PullToRefreshBase(PullToRefreshListView的基类)中的mHeaderLayout并未测量完成。而只有mHeaderLayout为刷新结束即手放开的时候才会调用设定的onRefreshingListener()。这里有个小知识点View的measure操作和Activity的生命周期并不是同步的。
百度了各种方法,基本有两种:
1.使用延时调用ptrLv.setRefreshing()方法,延时目的是等mHeaderLayout测量完成,代码大致如下(在onCreate或者Fragment的onCreateView中调用)

new Handler().postDelayed(new Runnable(){
    public void run(){
         ptrLv.setRefreshing();
    }
},200);

缺点:1.上面是延时200毫秒自动刷新,对体验性能有影响,2设定的200毫秒不一定能保证mHeaderLayout测量完成,则根据本文开始的介绍,有可能不会触发刷新。所以只能延长加载的时延

2.为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测量之后。

以上两种方法均来自网上,非原创。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值