Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SwipeRefreshLayout多次拉动行为(SDK 23)_Android_Swiperefreshlayout_Android 6.0 Marshmallow - Fatal编程技术网

Android SwipeRefreshLayout多次拉动行为(SDK 23)

Android SwipeRefreshLayout多次拉动行为(SDK 23),android,swiperefreshlayout,android-6.0-marshmallow,Android,Swiperefreshlayout,Android 6.0 Marshmallow,我有这样的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_heigh

我有这样的
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>
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
,旋转的动画变得怪异,有时它会停留在屏幕上而不旋转:

在第一次拉动时,它看起来有点在顶部,在第二次拉动时,它下降了一点,更像是在图像上

如何在已经刷新的情况下禁用多个pull-on
SwipeRefresh
? 我想这不会发生在sdk 23以下。我正在使用buildtool23、targetsdk23、support-v4:23、appcompat-v7:23


更新:如果我使用
ListView
而不是
RecyclerView
,此时添加布尔变量以检查列表是否刷新,则不会发生这种情况

if (!refreshing)
refreshContent();

您可以将
SwipeRefreshLayout
子类化,提供
canChildScrollUp()的自定义实现


当然,您应该检查您的recycler视图是否已经显示了它的第一个子视图,并相应地返回一个值

当您完成数据更新时,需要调用mSwipeRefreshLayout.stopRefresh()

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

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

它看起来像是23.0.0版本中引入的appcompat-v7支持库中的一个bug。 作为一种解决方法,您可以在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()是否正确引起的

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

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

“support-v4:23.1.0”已经修复了此错误。

是的,但是在哪里,如何知道我是否在第二次拉它?除此之外,我还有recyclerView,它也有pull功能。我的问题不是刷新内容,而是SwiperFresh。它应该不允许我在它已经刷新的时候拉它。奇怪。我也在用这个,但我没有遇到这样的麻烦。是否已添加swipeLayout.setOnRefreshListener(此);?我这样做,问题是不同的:)你能请尝试一下,如果它的工作低于v23?在v23上有很多东西不能以同样的方式工作,我也有一些问题…在另一个buildToolsVersion“22.0.1”、targetSdk 22、appcompat-v7:22.1.0的项目上,它工作正常此方法与在某些情况下是否可以滚动子项有关。当拉动刷卡时会调用它吗?会的。给它一个tryit现在编译,但仍然是相同的行为如何使用
onload()
?一种方法是每次加载后调用它on load()方法。是的,问题在于SwiperFreshLayout如何处理触摸事件。建议的解决方案至少在调用onRefresh的情况下修复了它。我在Android bug tracker中打开了一个bug,我们将看到Google开发者对此的看法:mSwipeRefreshLayout.setNestedScrollingEnabled(true);
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
    return !isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes);
}