继承前面讲的两章,你如今对这第三方自定义控件已经会用了缓存
不过,问题来了,咱们有个需求是打开这软件的时候,须要自动刷新,而不是咱们手动给他加载数据,怎么弄呢?就像以下图网络
这个具体怎么实现呢?ide
其实很简单,只须要把咱们前面第一章的第五步改为:this
// 设置刷新监听 pListView.setOnRefreshListener( new OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { Log.d("PullToRefresh","-------onRefresh被调用-------- ShownHeader="+refreshView.isShownHeader()+" ShownFooter="+refreshView.isShownFooter()); String str = DateUtils.formatDateTime(MainActivity.this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // 上拉加载更多 业务代码 if (refreshView.isShownFooter()) { Log.d("refresh", "-----上拉加载----------"); refreshView.getLoadingLayoutProxy().setRefreshingLabel("正在加载"); refreshView.getLoadingLayoutProxy().setPullLabel("上拉加载更多"); refreshView.getLoadingLayoutProxy().setReleaseLabel("释放开始加载"); refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:" + str); new MyTask().execute(); }else{ Log.d("refresh", "------下拉刷新---------"); refreshView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新"); refreshView.getLoadingLayoutProxy().setPullLabel("下拉刷新"); refreshView.getLoadingLayoutProxy().setReleaseLabel("释放开始刷新"); refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" + str); new MyTask().execute(); } } }); // 设置自动刷新 pListView.setRefreshing(true);
Ps:主要上面红色那一句,设置为自动刷新;spa
Run->咱们发现,效果和咱们效果图同样同样的,很棒。可是咱们看下日志:日志
咱们惊奇的发现一个问题了:为何isShownHeader(),isShownFooter()这标示拉是上拉仍是下拉的标志都是false呢?code
我从源码的角度分析下:实际上是因为拉得时候显示出来的view和刷新中出来的view不是同一个view。orm
setRefreshing(true)最终会到PullToRefreshListView的OnRefresh()方法中:blog
咱们看到了,它被hide了,因此isShown方法才会为false,这下就说得通了,因此咱们就用else来捕捉自动刷新;继承
再说一个用setRefresh(true)的另外一经常使用问题,不少人设置了,可是发现列表头部一直显示在刷新。而且没有调用onRefresh()方法,这是什么缘由呢?
是因为咱们的适配器是空的,里面没有任何值,简单来讲,就像把我第一章初始化适配器的方法,不进行对适配器数据集(adapter.add(?))里面塞数据同样的。
咱们看下源码:
在PullToRefreshListView的OnRefresh()方法:
若是适配器为null,或者里面没有数据,就会return这方法,因此形成这结果,那咱们怎么处理呢?
pulltorefresh的构建思想。刷新,首先你必需要有数据吧,我才能刷新。
而在通常咱们程序开发,都会有缓存机制。首先去读缓存中得数据,而后再去获取网络校验数据完成刷新界面。也就是在适配器初始化好后,当即读缓存,都适配器的数据集塞值。最终设置onRefresh(true)完成自动刷新。
固然咱们能够,把源码小小改下,就是把我上图中红色框里面的adapter.isEmpty()去掉,这样就不用必须对初始化好的适配器付完在值才能自动刷新了!
以上即是pulltorefresh的自动刷新内容,谢谢观看!