8

我正在android.support.v4.widget.SwipeRefreshLayout使用android.support.v7.widget.RecyclerView.
在创建片段视图时,我需要显示SwipeRefreshLayout动画。但是当我打电话时,setRefreshing(true)什么也没有发生。但是当我刷新数据时动画会发生变化。
我想如果里面没有孩子,动画就不会显示SwipeRefreshLayout
如何以最好的方式展示这个动画?

4

5 回答 5

10

这是一个已报告的错误(在此处报告),并且有一个解决方法可用:

mSwipeRefreshLayout.setProgressViewOffset(false, 0,
    (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, 
        24, 
        getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);
于 2014-11-05T17:59:16.160 回答
2

多谢你们。

我刚刚意识到最简单的解决方案是在调用 setRefreshing(true) 之前调用具有非零值的方法 measure(int, int)。问题正在发生,因为 setRefreshing(true) 在 onMeasure 之前调用。

所以你需要打电话:

swipeRefreshLayout.measure(initialWidth, initialHeight);
swipeRefreshLayout.setRefreshing(true);
于 2014-11-01T20:20:05.640 回答
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;
于 2014-10-29T20:44:55.657 回答
1

SwipeRefreshLayout 必须包含一个子级才能正常工作。确保在任何地方使用它之前对其进行初始化!

于 2014-10-21T18:02:07.180 回答
0

你必须调用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().

于 2015-11-15T07:53:20.807 回答