怎样实现SwipeRefreshLayout的自动刷新
答案:3 悬赏:40 手机版
解决时间 2021-03-17 01:39
- 提问者网友:自食苦果
- 2021-03-16 10:26
怎样实现SwipeRefreshLayout的自动刷新
最佳答案
- 五星知识达人网友:北方的南先生
- 2021-03-16 11:24
首先想要在界面一加载的时候出现更新效果,直接调用setRfreshing(true)是出不来效果的,这个问题我以前也遇到过,必须调用
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
关闭的时候也使用
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(false);
}
});
但是如果你认为这样就会走onRefresh方法,那你就大错特错了,setRefreshing(true)是不会触发onRefresh的,必须要手动调用一次
所以在界面onCreate里面想要立刻加载就需要这样
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
onRefresh();
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
关闭的时候也使用
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(false);
}
});
但是如果你认为这样就会走onRefresh方法,那你就大错特错了,setRefreshing(true)是不会触发onRefresh的,必须要手动调用一次
所以在界面onCreate里面想要立刻加载就需要这样
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
onRefresh();
全部回答
- 1楼网友:一叶十三刺
- 2021-03-16 12:15
上代码
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mTarget == null) {
ensureTarget();
}
if (mTarget == null) {
return;
}
mTarget.measure(MeasureSpec.makeMeasureSpec(
getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY));
mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mCircleHeight, MeasureSpec.EXACTLY));
if (!mUsingCustomStart && !mOriginalOffsetCalculated) {
mOriginalOffsetCalculated = true;
mCurrentTargetOffsetTop = mOriginalOffsetTop = -mCircleView.getMeasuredHeight();
}
mCircleViewIndex = -1;
// Get the index of the circleview.
for (int index = 0; index < getChildCount(); index++) {
if (getChildAt(index) == mCircleView) {
mCircleViewIndex = index;
break;
}
}
}
如代码所见,是在onMeasure里获取的,根据CircleView的高度来赋值的。
所以要解决的方法是让mOriginalOffsetTop能在setRefreshing前正确赋值。比较笨的方法是在onCreate里或onCreateView手动赋值,不推荐。
正确做法是在onMeasure触发后再调用setRefreshing。
代码如下:
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
root.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mRefreshLayout.setRefreshing(true);
loadData(true);
}
});
其它的下拉刷新库也有类似问题,关键变量需要在onMeasure里获取。也无法显示到正确的位置。类似其它自定义控件需要在控件没有度量好,先调用涉及到相关变量的方法,都可以类似解决。
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mTarget == null) {
ensureTarget();
}
if (mTarget == null) {
return;
}
mTarget.measure(MeasureSpec.makeMeasureSpec(
getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY));
mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mCircleHeight, MeasureSpec.EXACTLY));
if (!mUsingCustomStart && !mOriginalOffsetCalculated) {
mOriginalOffsetCalculated = true;
mCurrentTargetOffsetTop = mOriginalOffsetTop = -mCircleView.getMeasuredHeight();
}
mCircleViewIndex = -1;
// Get the index of the circleview.
for (int index = 0; index < getChildCount(); index++) {
if (getChildAt(index) == mCircleView) {
mCircleViewIndex = index;
break;
}
}
}
如代码所见,是在onMeasure里获取的,根据CircleView的高度来赋值的。
所以要解决的方法是让mOriginalOffsetTop能在setRefreshing前正确赋值。比较笨的方法是在onCreate里或onCreateView手动赋值,不推荐。
正确做法是在onMeasure触发后再调用setRefreshing。
代码如下:
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
root.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mRefreshLayout.setRefreshing(true);
loadData(true);
}
});
其它的下拉刷新库也有类似问题,关键变量需要在onMeasure里获取。也无法显示到正确的位置。类似其它自定义控件需要在控件没有度量好,先调用涉及到相关变量的方法,都可以类似解决。
- 2楼网友:枭雄戏美人
- 2021-03-16 11:37
首先想要在界面一加载的时候出现更新效果,直接调用setRfreshing(true)是出不来效果的,这个问题我以前也遇到过,必须调用
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
关闭的时候也使用
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(false);
}
});
但是如果你认为这样就会走onRefresh方法,那你就大错特错了,setRefreshing(true)是不会触发onRefresh的,必须要手动调用一次
所以在界面onCreate里面想要立刻加载就需要这样
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
onRefresh();
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
关闭的时候也使用
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(false);
}
});
但是如果你认为这样就会走onRefresh方法,那你就大错特错了,setRefreshing(true)是不会触发onRefresh的,必须要手动调用一次
所以在界面onCreate里面想要立刻加载就需要这样
SwipeRefreshLayout.post(new Runable(){
@Override
public void run() {
SwipeRefreshLayout.setRefreshing(true);
}
});
onRefresh();
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯