码迷,mamicode.com
首页 > 其他好文 > 详细

pulltorefresh(三)自动刷新

时间:2015-01-19 12:26:56      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

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

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

技术分享

这个具体怎么实现呢?

其实很简单,只需要把我们前面第一章的第五步改成:

// 设置刷新监听
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的自动刷新内容,谢谢观看!

 

pulltorefresh(三)自动刷新

标签:

原文地址:http://www.cnblogs.com/runssnail/p/4228114.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!