Open razerdp opened 8 years ago
原来如此,怪不得我的autoRefresh总是只有刷新,没有显示头出来,但是不知道原因是什么,通过设置延迟,确实可以显示头出来了
难怪刚创建的时候自动刷新不显示头出来。 对于由于刚创建导致获取高度为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;
}
我也遇到这个问题
经过调试,autoRefresh应该是要延迟执行,大概150ms就可以了,我在使用的时候发现,比如我的activity刚创建,然后调用autoRefresh就会导致在0位置就刷新,而没有自动滑动下来。
在调试的时候,发现setRatioOfHeaderHeightToRefresh设置后,就跳到autoRefresh的tryToScroll了,然后再跳到setHeaderHeight,第一次的heaerHeight=0,第二次因为通过measure,所以这时候就能测量出headerHeight
所以我在使用的时候通过postDelayed(),大概150毫秒执行就可以了。。。
忽然留意到autoRefresh(atOnce),但是看了代码,发现这个mFlag似乎与tryToScrollTo的函数没什么关系。。。
不知道这算不算一个bug-V-