我正在使用android.support.v4.widget.SwipeRefreshLayout
和android.support.v7.widget.RecyclerView
。在创建片段视图时,我需要显示SwipeRefreshLayout
动画。但是当我调用setRefreshing(true)
时,没有任何反应。但是当我刷新数据时,动画会改变。
我认为如果SwipeRefreshLayout
内部没有子元素,则不会显示动画。
如何以最佳方式显示此动画?
我正在使用android.support.v4.widget.SwipeRefreshLayout
和android.support.v7.widget.RecyclerView
。在创建片段视图时,我需要显示SwipeRefreshLayout
动画。但是当我调用setRefreshing(true)
时,没有任何反应。但是当我刷新数据时,动画会改变。
我认为如果SwipeRefreshLayout
内部没有子元素,则不会显示动画。
如何以最佳方式显示此动画?
这是一个已报告的漏洞(在这里报告),并且现有一种解决方法:
mSwipeRefreshLayout.setProgressViewOffset(false, 0,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
24,
getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);
这取决于您正在构建的API级别-如果您使用的是API 20或更早版本,则可以打开setRefreshing(true),这将在操作栏中运行动画,但在API 21(材料设计)中,进度条被更改为一个被“拉入视图”之前旋转的微调器。
在API 21中,有两种方法可以解决这个问题: 1)使用setProgressViewOffset()将微调器向下移动,但记得在完成后将其移回(请注意,此方法使用px,而setDistanceToTriggerSync()则使用dp) 2)制作一个重复的微调器,在加载数据时显示它
更加代码高效的解决方案是使用现有的微调器,但是您必须小心,确保重置其位置。
如果您需要计算像素密度,可以从以下位置获取:
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
float scale = metrics.density;
谢谢,大家。
我刚意识到最简单的解决方法是在调用setRefreshing(true)之前调用measure(int, int)方法并传入非零值。问题是由于在onMeasure之前调用了setRefreshing(true)所导致的。
因此,您需要这样调用:
swipeRefreshLayout.measure(initialWidth, initialHeight);
swipeRefreshLayout.setRefreshing(true);
SwipeRefreshLayout必须包含一个子项才能正常工作。在任何地方使用之前,请确保您已经初始化了它!
在调用onDraw()
后,您必须调用setRefreshing(true)
,否则动画不会显示。
因此,在Activity中,您可以在onCreate()
中执行此操作,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// other codes
new Handler().post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
refreshing = true;
refreshData();
}
}
}
在片段中,您可以将这些代码放在onActivityCreated()
中。
measure
。 - TWiStErRob