美文网首页ITBOXAndroid开发学习Android 开发技术分享
实现SwipeRefreshLayout首次进入自动刷新

实现SwipeRefreshLayout首次进入自动刷新

作者: RaphetS | 来源:发表于2016-11-05 20:19 被阅读2572次

    看到了Android版知乎实现了这种效果,就自己也实现了一下。

    先来一张效果图

    swipeRefrsh.gif

    实现方式:

    方法一、

    ①在onWindowFocusChanged()方法中,设置为刷新状态为true

    @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            mSwipeRefreshLayout.setRefreshing(true);
        }
    

    ②在获取数据完成后设置刷新状态为false

    if (mSwipeRefreshLayout.isRefreshing()) {
                                mSwipeRefreshLayout.setRefreshing(false);
                            }
    

    方法二、

    ①调用mSwipeRefreshLayout.measure()方法后,设置刷新状态为true

    //手动调用,通知系统去测量
            mSwipeRefreshLayout.measure(0,0);
            mSwipeRefreshLayout.setRefreshing(true);
    

    ②在获取数据完成后设置刷新状态为false

    if (mSwipeRefreshLayout.isRefreshing()) {
                                mSwipeRefreshLayout.setRefreshing(false);
                            }
    

    方法三、

    ①在view.post(new Runnable)方法中设置刷新状态为true

    mSwipeRefreshLayout.post(new Runnable() {
                @Override
                public void run() {
                    Log.i("getMeasuredHeight",mSwipeRefreshLayout.getMeasuredHeight()+"");
                    mSwipeRefreshLayout.setRefreshing(true);
                }
            });
    

    ②在获取数据完成后设置刷新状态为false

    if (mSwipeRefreshLayout.isRefreshing()) {
                                mSwipeRefreshLayout.setRefreshing(false);
                            }
    

    <br />

    方法四、

    ①使用ViewTreeObserver

            ViewTreeObserver obeser=mSwipeRefreshLayout.getViewTreeObserver();
            obeser.addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
                @Override
                public void onWindowFocusChanged(boolean hasFocus) {
                    mSwipeRefreshLayout.setRefreshing(true);
                    Log.i("11getMeasuredHeight",mSwipeRefreshLayout.getMeasuredHeight()+"");
                }
            });
    

    ②在获取数据完成后设置刷新状态为false

    if (mSwipeRefreshLayout.isRefreshing()) {
                                mSwipeRefreshLayout.setRefreshing(false);
                            }
    

    说明:

    每种方法的第一步,都是为了保证SwipeRefreshLayout绘制完成,再调用方法显示刷新球,否则界面比较的复杂的时候,刷新球会不显示。

    源码:https://github.com/RaphetS/swiperefreshdemo

    相关文章

      网友评论

      • 请叫我章鱼哥:大侠还有一种方法

        refresh.setProgressViewOffset(false, 0, CommonUtil.dip2px(context, 24));
        refresh.setRefreshing(true);
      • 1e62239cf04d:更简单的方法:
        SwipeRefreshLayout mRefreshLayout;
        mRefreshLayout.post(new Runnable() {
        @Override
        public void run() {
        mRefreshLayout.setRefreshing(true);

        }
        });
        RaphetS:@sachil 不错,我正想加上
      • 向日葵lll:请问下,fragment怎么实现。没有那个方法
        RaphetS:@琳琳不开心 已更新
      • 半_农:在fragment中如何体现?
        RaphetS:@半_农 已更新fragment实现方法
      • code小生:好,有时候有这个需要。收藏了
        RaphetS: @code小生 喜欢就好
      • 永正:可以可以
      • 沈敏杰:实用博文
        RaphetS: @沈敏杰 实用就好
      • 27c7534af0e9:两种方法有啥不一样
        27c7534af0e9: @RaphetS👌
        RaphetS: @靠靠果 没啥不一样,目的都是解决有时候刷新球不显示的bug
      • 枫叶灬陽:你好,布局中,最外层是用SwipeRefreshLayout吗?里面再写具体细节。(要是没有电脑,想问一下。)
        RaphetS: @枫叶灬陽 对的,swiprefreshlayout包裹要刷新的内容
      • YungFan:可以可以

      本文标题:实现SwipeRefreshLayout首次进入自动刷新

      本文链接:https://www.haomeiwen.com/subject/ymdguttx.html