SwipeRefreshLayout 拉取多次行为(SDK 23)

SwipeRefreshLayout pull multiple times behaviour (SDK 23)

我有 SwipeRefreshLayout 是这样的:

.xml:

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/haberRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

.java:

private SwipeRefreshLayout swipeLayout;
swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout);
        swipeLayout.setColorSchemeColors(getResources().getColor(R.color.primary_color));
        swipeLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshContent();
            }
        });

这让我可以拉 swipeRefresh 多次 并且循环动画变得很奇怪,有时它会停留在屏幕上而不循环:

在第一次拉动时它看起来有点在上面,在第二次拉动时它下降了一点,就像图片上一样。

如何在已经刷新的情况下禁用 多次拉动 SwipeRefresh? 我想这不会发生在 sdk 23 以下。我正在使用 buildTool 23、targetSdk 23、support-v4:23、appcompat-v7:23。

更新: 如果我使用 ListView 而不是 RecyclerView,则不会发生这种情况。

添加布尔变量来检查您的列表是否正在刷新。

if (!refreshing)
refreshContent();

您可以子类化 SwipeRefreshLayout,提供 canChildScrollUp()

的自定义实现
 @Override
public boolean canChildScrollUp() {
   if (isRefreshing()) {
        return true;
   }
   return false;
}

当然你应该检查你的回收站视图是否已经显示了它的第一个 child 和 return 相应的值

您需要在完成数据更新后调用 mSwipeRefreshLayout.stopRefreshing()。

public void refreshContent() {
...
//end of your "refresh" code

if(mSwipeRefreshLayout.isRefreshing())
    mSwipeRefreshLayout.stopRefreshing()
}

这看起来像是 23.0.0 版本中引入的 appcompat-v7 支持库中的错误。 作为解决方法,您可以在 OnRefreshListener#onRefresh 回调中禁用 SwipeRefreshLayout,并在加载数据时再次启用它:

private class MyOnRefreshListener implements SwipeRefreshLayout.OnRefreshListener {

    @Override
    public void onRefresh() {
        swipeRefreshLayout.setEnabled(false);
        load();
    }

    private void onLoaded() {
        swipeRefreshLayout.setEnabled(true);
        swipeRefreshLayout.setRefreshing(false);
    }
}

这个问题是在 support-v4 23.0.0 中引入的,是由于新的嵌套滚动功能没有检查是否 isRefreshing()。

您应该扩展 SwipeRefreshLayout 并覆盖 onStartNestedScroll 函数:

@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
    return !isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes);
}

"support-v4:23.1.0" 已经修复了这个错误。