SwipeRefreshLayout在Fragment创建时没有动画效果。

8

我正在使用android.support.v4.widget.SwipeRefreshLayoutandroid.support.v7.widget.RecyclerView。在创建片段视图时,我需要显示SwipeRefreshLayout动画。但是当我调用setRefreshing(true)时,没有任何反应。但是当我刷新数据时,动画会改变。
我认为如果SwipeRefreshLayout内部没有子元素,则不会显示动画。
如何以最佳方式显示此动画?

5个回答

10

这是一个已报告的漏洞(在这里报告),并且现有一种解决方法:

mSwipeRefreshLayout.setProgressViewOffset(false, 0,
    (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, 
        24, 
        getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);

2

这取决于您正在构建的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;

2

谢谢,大家。

我刚意识到最简单的解决方法是在调用setRefreshing(true)之前调用measure(int, int)方法并传入非零值。问题是由于在onMeasure之前调用了setRefreshing(true)所导致的。

因此,您需要这样调用:

swipeRefreshLayout.measure(initialWidth, initialHeight);
swipeRefreshLayout.setRefreshing(true);

2
这是一种错误的做法,因为你会遇到各种NPE。 - Tadas Šubonis
@TadasŠubonis,你能解释一下这个代码会产生什么NPE吗?我看不出有什么问题。 - John Shelley
还有,@Maksym,你在度量值上使用了什么? - John Shelley
在我的情况下,它(SwipeRefreshLayout)包含一个RecyclerView,在调用.measure()时,它将传播到RecyclerView内部,然后会抛出NPE。现在手头没有可用的堆栈... - Tadas Šubonis
@TadasŠubonis 也许你在设置 RecyclerView 的布局管理器之前调用了 measure - TWiStErRob

1

SwipeRefreshLayout必须包含一个子项才能正常工作。在任何地方使用之前,请确保您已经初始化了它!


0

在调用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()中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接