关于SwipeRefreshLayout在onCreate中调用setRefreshing()方法时的修改
2014-11-24 13:50
337 查看
对于联网类型的应用,通常我们在进入应用时,需要加载数据,并且提示一个加载的进度条。如果使用官方的下拉刷新控件SwipeRefreshLayout本身是带进度条显示功能的,我们自然会想要重用他的进度条。但是如果你想要在onCreate里把他调出来,直接调用setRefreshing()方法是不行的,如下是setRefreshing()方法的源码:
public void setRefreshing(final boolean refreshing)
{
if (refreshing && mRefreshing != refreshing)
{
// scale and show
mRefreshing = refreshing;
int endTarget =
0;
if (!mUsingCustomStart)
{
endTarget = (int)
(mSpinnerFinalOffset + mOriginalOffsetTop);
} else {
endTarget = (int) mSpinnerFinalOffset;
}
setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,
true /*
requires update */);
mNotify = false;
startScaleUpAnimation(mRefreshListener);
} else {
setRefreshing(refreshing, false /*
notify */);
}
}
查看源码,可以知道,该方法内部主要是调用了setTargetOffsetTopAndBottom()方法调整进度条的位置来显示的。在没出控件完成onLayout方法之前,位置数据都是不准确的,所以显示不出来很正常。
要解决这个问题很简单,把咱们要做的这个事情需要通过post(Runnable runnable)方法放到UI线程排队执行,否则,参数不对,自然显示不出来。
mSwipeRefreshLayout.post(new Runnable()
{
@Override
public void run()
{
mSwipeRefreshLayout.setRefreshing(true);
}
});
当然,也可以把源码提出来将原方法稍微修改一下,一劳永逸。如下:
/**
* Notify the widget that refresh state has changed. Do not call this when
* refresh is triggered by a swipe gesture.
*
*@paramrefreshing
Whether or not the view should show refresh progress.
*/
public void setRefreshing(final boolean refreshing)
{
if(refreshing&&mRefreshing!=refreshing)
{
post(new Runnable()
{
@Override
public void run()
{
// scale and show
mRefreshing=refreshing;
int endTarget=
0;
if(!mUsingCustomStart)
{
endTarget= (int)
(mSpinnerFinalOffset+mOriginalOffsetTop);
}else{
endTarget= (int)mSpinnerFinalOffset;
}
setTargetOffsetTopAndBottom(endTarget-mCurrentTargetOffsetTop,true/*
* requires
* update
*/);
mNotify=false;
startScaleUpAnimation(mRefreshListener);
}
});
}else{
setRefreshing(refreshing,false/*
notify */);
}
}
public void setRefreshing(final boolean refreshing)
{
if (refreshing && mRefreshing != refreshing)
{
// scale and show
mRefreshing = refreshing;
int endTarget =
0;
if (!mUsingCustomStart)
{
endTarget = (int)
(mSpinnerFinalOffset + mOriginalOffsetTop);
} else {
endTarget = (int) mSpinnerFinalOffset;
}
setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,
true /*
requires update */);
mNotify = false;
startScaleUpAnimation(mRefreshListener);
} else {
setRefreshing(refreshing, false /*
notify */);
}
}
查看源码,可以知道,该方法内部主要是调用了setTargetOffsetTopAndBottom()方法调整进度条的位置来显示的。在没出控件完成onLayout方法之前,位置数据都是不准确的,所以显示不出来很正常。
要解决这个问题很简单,把咱们要做的这个事情需要通过post(Runnable runnable)方法放到UI线程排队执行,否则,参数不对,自然显示不出来。
mSwipeRefreshLayout.post(new Runnable()
{
@Override
public void run()
{
mSwipeRefreshLayout.setRefreshing(true);
}
});
当然,也可以把源码提出来将原方法稍微修改一下,一劳永逸。如下:
/**
* Notify the widget that refresh state has changed. Do not call this when
* refresh is triggered by a swipe gesture.
*
*@paramrefreshing
Whether or not the view should show refresh progress.
*/
public void setRefreshing(final boolean refreshing)
{
if(refreshing&&mRefreshing!=refreshing)
{
post(new Runnable()
{
@Override
public void run()
{
// scale and show
mRefreshing=refreshing;
int endTarget=
0;
if(!mUsingCustomStart)
{
endTarget= (int)
(mSpinnerFinalOffset+mOriginalOffsetTop);
}else{
endTarget= (int)mSpinnerFinalOffset;
}
setTargetOffsetTopAndBottom(endTarget-mCurrentTargetOffsetTop,true/*
* requires
* update
*/);
mNotify=false;
startScaleUpAnimation(mRefreshListener);
}
});
}else{
setRefreshing(refreshing,false/*
notify */);
}
}
相关文章推荐
- [android]关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机
- 关于TreeSet<E>泛型类中的compareTo()方法的调用
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- JAVA学习日志 关于调用方法、生成对象的例子。还是用数字卦程序修改
- 关于TreeSet<E>泛型类中的compareTo()方法的调用
- Android实现欢迎页:在onCreate方法中两次调用setContentView
- AndroidGUI28:在onCreate方法中两次调用setContentView
- Android中一个Activity第二次启动时,onCreate()调用setContentView()方法时出错,程序崩溃
- IntelliJ IDEA中关于get、set方法Code template的编辑,用于修改get、set注释
- 关于setNeedsDisplay、setNeedsLayout方法,UIView的layoutSubviews和drawRect方法何时调用
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- 关于JPA封装数据库数据到实体不调用属性的get和set的方法解决办法
- 关于SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法调用时机的疑惑
- AndroidGUI28:在onCreate方法中两次调用setContentView
- 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验
- 关于Java调用dll的方法
- 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验
- 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验
- 关于Java调用dll的方法
- 关于修改注册表来修改VC6.0字体的方法