SwipeRefreshLayout得到Action_Move冻结视图

时间:2014-11-17 13:20:58

标签: android android-fragments navigation-drawer drawerlayout swiperefreshlayout

我有一个包含不同片段的普通NavigationDrawer:

  • 新闻
  • 其他东西1
  • 其他东西2
  • 设置

问题:

NewsFragment包含SwipeRefreshLayout。它第一次刷新时效果很好。

我可以将片段更改为其他东西1和2以及设置。所以我回到NewsFragment。

现在当我刷新时,片段会冻结。

drawerLayout正常工作(打开/关闭,甚至ActionBar标题更改),但主片段保留在NewsFragment,我无法滚动。但scollListner工作(我有日志),但视图没有改变。

没有refreshView(swipeRefreshLayout的顶部),没有滚动,没有响应按钮(在焦点上,onclick)但只是在视觉上。

实际上,它就像一个响应片段在冷冻片段后面。

此外,我在ADBLog中遇到此错误:

SwipeRefreshLayout﹕ Got ACTION_MOVE event but don't have an active pointer id.

任何想法??

如果你问,我可以发布代码。

3 个答案:

答案 0 :(得分:11)

好的,我找到了解决方案。我发布它是因为它可能发生在每个人身上,这有点无聊(为我找两天)。

首先我在我的XML中有这个,其中包含SwipeRefreshLayout(一个片段):

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/news_container_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:background="@color/news_background">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/news_list_recycle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:dividerHeight="5dp" />


    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/news_progress"
        android:visibility="invisible"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />


</RelativeLayout>

所以,为了修复这个错误,你需要在你的SWIPEREFRESHLAYOUT中拥有回收(或列表视图):

所以,我移动我的progressBar并将RelativeLayout设为rootView。

结果:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ProgressBar
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/news_progress"
    android:visibility="invisible"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/news_container_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    android:background="@color/news_background">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/news_list_recycle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:dividerHeight="5dp" />

</android.support.v4.widget.SwipeRefreshLayout>

我希望以后可以帮助别人。

答案 1 :(得分:0)

This answer为我工作。这是关于清除onPause()中的刷新布局。

答案 2 :(得分:-1)

您的代码示例确实解决了这个问题。这似乎是v21支持库的一个问题。

为了帮助其他可能遇到此问题的其他人,我们的问题似乎是SwipeRefreshLayout不再乐意成为根视图。

添加RelativeLayout以包裹SwipeRefreshLayout修复了您的案例中的错误,而不仅仅是ListView/RecyclerView内的SwipeRefreshLayout。我没有尝试,但我猜测LinearLayout或其他也会解决问题。

所以修复是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
        <android.support.v4.widget.SwipeRefreshLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent">
                    <!-- List, Layout etc -->
        </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>