我正在android.support.v4.widget.SwipeRefreshLayout
使用android.support.v7.widget.RecyclerView
.
在创建片段视图时,我需要显示SwipeRefreshLayout
动画。但是当我打电话时,setRefreshing(true)
什么也没有发生。但是当我刷新数据时动画会发生变化。
我想如果里面没有孩子,动画就不会显示SwipeRefreshLayout
。
如何以最好的方式展示这个动画?
5 回答
这是一个已报告的错误(在此处报告),并且有一个解决方法可用:
mSwipeRefreshLayout.setProgressViewOffset(false, 0,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
24,
getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);
多谢你们。
我刚刚意识到最简单的解决方案是在调用 setRefreshing(true) 之前调用具有非零值的方法 measure(int, int)。问题正在发生,因为 setRefreshing(true) 在 onMeasure 之前调用。
所以你需要打电话:
swipeRefreshLayout.measure(initialWidth, initialHeight);
swipeRefreshLayout.setRefreshing(true);
这取决于您在哪个 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;
SwipeRefreshLayout 必须包含一个子级才能正常工作。确保在任何地方使用它之前对其进行初始化!
你必须调用setRefreshing(true)
after 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()
.