我将android.support.v4.widget.SwipeRefreshLayout
与android.support.v7.widget.RecyclerView
一起使用
在片段视图创建时,我需要显示SwipeRefreshLayout
动画。但是当我打电话给setRefreshing(true)
时,没有任何反应。但是当我刷新数据动画的变化时
我想动画在SwipeRefreshLayout
内没有孩子的情况下也没有显示
如何以最佳方式显示此动画?
答案 0 :(得分:10)
这是一个报告的错误(报告为here),并提供了一种解决方法:
mSwipeRefreshLayout.setProgressViewOffset(false, 0,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
24,
getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);
答案 1 :(得分:3)
谢谢,伙计们。
我刚刚意识到最简单的解决方案是在调用setRefreshing(true)之前调用方法measure(int,int)和非零值)。问题出现了,因为setRefreshing(true)在onMeasure之前调用。
所以你需要打电话:
swipeRefreshLayout.measure(initialWidth, initialHeight);
swipeRefreshLayout.setRefreshing(true);
答案 2 :(得分:2)
这取决于您正在构建的API级别 - 如果您正在使用API 20,那么您可以打开setRefreshing(true),这将在ActionBar中运行动画,但在API 21中(材质)设计)他们将进度改为旋转器,而不是在旋转之前“拉入视野”
您有两种方法可以在API 21中解决这个问题: 1)使用setProgressViewOffset()向下移动微调器,但记得在字之后将其移回(请注意,这在px中有效,而setDistanceToTriggerSync()使用dp) 2)创建一个在加载数据时显示的重复微调器
代码效率更高的解决方案是使用现有的微调器,但您必须小心重置其位置
如果您需要计算像素密度,可以从以下位置获取:
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
float scale = metrics.density;
答案 3 :(得分:0)
SwipeRefreshLayout必须包含一个正常工作的子项。确保在任何地方使用它之前对其进行初始化!
答案 4 :(得分:0)
您必须在setRefreshing(true)
之后致电onDraw()
,否则它将无法显示动画。
所以,在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()
。