liaohuqiu / android-Ultra-Pull-To-Refresh

Ultra Pull to Refresh for Android. Support all the views.
MIT License
9.58k stars 2.66k forks source link

很抱歉直接写中文。。。关于autoRefresh的 #189

Open razerdp opened 8 years ago

razerdp commented 8 years ago

经过调试,autoRefresh应该是要延迟执行,大概150ms就可以了,我在使用的时候发现,比如我的activity刚创建,然后调用autoRefresh就会导致在0位置就刷新,而没有自动滑动下来。

在调试的时候,发现setRatioOfHeaderHeightToRefresh设置后,就跳到autoRefresh的tryToScroll了,然后再跳到setHeaderHeight,第一次的heaerHeight=0,第二次因为通过measure,所以这时候就能测量出headerHeight

所以我在使用的时候通过postDelayed(),大概150毫秒执行就可以了。。。

忽然留意到autoRefresh(atOnce),但是看了代码,发现这个mFlag似乎与tryToScrollTo的函数没什么关系。。。

不知道这算不算一个bug-V-

epolar commented 8 years ago

原来如此,怪不得我的autoRefresh总是只有刷新,没有显示头出来,但是不知道原因是什么,通过设置延迟,确实可以显示头出来了

msdx commented 8 years ago

难怪刚创建的时候自动刷新不显示头出来。 对于由于刚创建导致获取高度为0的问题,我的通用解决方法如下:

            mPtrFrameLayout.post(new Runnable() {
                @Override
                public void run() {
                    mPtrFrameLayout.autoRefresh();
                }
            });

不过我仍觉得这是一个BUG。 @liaohuqiu 秋哥,你看看? 在Activity或Fragment刚创建时调用autoRefresh(),头部出不来。通过楼主的提示,找到PtrFrameLayout的如下代码:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // 省略一波代码

        if (mHeaderView != null) {
            measureChildWithMargins(mHeaderView, widthMeasureSpec, 0, heightMeasureSpec, 0);
            MarginLayoutParams lp = (MarginLayoutParams) mHeaderView.getLayoutParams();
            mHeaderHeight = mHeaderView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
            mPtrIndicator.setHeaderHeight(mHeaderHeight);
        }

        //先省略
    }

mHeaderHeight在这里才获取到。所以如果在这之前就调用刷新的话,该值还为0。导致滚动时获取到的offsetToRefresh为0,因而没有滚动。代码:

public void autoRefresh(boolean atOnce, int duration) {
//...
    mScrollChecker.tryToScrollTo(mPtrIndicator.getOffsetToRefresh(), duration);
//...
}
    public void setHeaderHeight(int height) {
        mHeaderHeight = height;
        updateHeight();
    }

    protected void updateHeight() {
        mOffsetToRefresh = (int) (mRatioOfHeaderHeightToRefresh * mHeaderHeight);
    }

    public int getOffsetToRefresh() {
        return mOffsetToRefresh;
    }
google2720 commented 8 years ago

我也遇到这个问题