继承前面讲的两章,你现在对这第三方自定义控件已经会用了
不过,问题来了,我们有个需求是打开这软件的时候,需要自动刷新,而不是我们手动给他加载数据,怎么弄呢?就像如下图
这个具体怎么实现呢?
其实很简单,只需要把我们前面第一章的第五步改成:
// 设置刷新监听 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:主要上面红色那一句,设置为自动刷新;
Run->我们发现,效果和我们效果图一样一样的,很棒。但是我们看下日志:
我们惊奇的发现一个问题了:为什么isShownHeader(),isShownFooter()这标示拉是上拉还是下拉的标志都是false呢?
我从源码的角度分析下:其实是由于拉得时候显示出来的view和刷新中出来的view不是同一个view。
setRefreshing(true)最终会到PullToRefreshListView的OnRefresh()方法中:
我们看到了,它被hide了,所以isShown方法才会为false,这下就说得通了,所以我们就用else来捕捉自动刷新;
再说一个用setRefresh(true)的另一常用问题,很多人设置了,但是发现列表头部一直显示在刷新。并且没有调用onRefresh()方法,这是什么原因呢?
是由于我们的适配器是空的,里面没有任何值,简单来说,就像把我第一章初始化适配器的方法,不进行对适配器数据集(adapter.add(?))里面塞数据一样的。
我们看下源码:
在PullToRefreshListView的OnRefresh()方法:
如果适配器为null,或者里面没有数据,就会return这方法,所以造成这结果,那我们怎么处理呢?
pulltorefresh的构建思想。刷新,首先你必须要有数据吧,我才能刷新。
而在一般我们程序开发,都会有缓存机制。首先去读缓存中得数据,然后再去获取网络校验数据完成刷新界面。也就是在适配器初始化好后,立即读缓存,都适配器的数据集塞值。最终设置onRefresh(true)完成自动刷新。
当然我们可以,把源码小小改下,就是把我上图中红色框里面的adapter.isEmpty()去掉,这样就不用必须对初始化好的适配器付完在值才能自动刷新了!
以上便是pulltorefresh的自动刷新内容,谢谢观看!