SwipeRefreshLayout片段创建时没有动画

时间:2014-10-21 18:00:32

标签: android animation android-recyclerview swiperefreshlayout

我将android.support.v4.widget.SwipeRefreshLayoutandroid.support.v7.widget.RecyclerView一起使用 在片段视图创建时,我需要显示SwipeRefreshLayout动画。但是当我打电话给setRefreshing(true)时,没有任何反应。但是当我刷新数据动画的变化时 我想动画在SwipeRefreshLayout内没有孩子的情况下也没有显示 如何以最佳方式显示此动画?

5 个答案:

答案 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()