pulltorefresh(三)自动刷新

继承前面讲的两章,你如今对这第三方自定义控件已经会用了缓存

不过,问题来了,咱们有个需求是打开这软件的时候,须要自动刷新,而不是咱们手动给他加载数据,怎么弄呢?就像以下图网络

这个具体怎么实现呢?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的自动刷新内容,谢谢观看!

相关文章
相关标签/搜索