pulltorefresh(三)自动刷新

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

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

pulltorefresh(三)自动刷新

这个具体怎么实现呢?

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

// 设置刷新监听

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

 

你可能感兴趣的:(refresh)