2015-06-14 33 views
23

zacząłem używać nowego CoordinatorLayout i wpadłem na ten problem:Przewijanie w dół wyzwala odświeżyć zamiast ujawniając pasek

demo

Jak widać, gdy próbuję przewijać w dół, gdy pasek narzędzi jest częściowo widoczny a widok recylcer jest na najwyższej pozycji uruchamia zdarzenie odświeżania zamiast ciągnąć w dół pasek narzędzi. Użytkownik musi przewinąć w górę niż w dół, aby go odsłonić.

Układ XML wygląda mniej więcej tak: activity_main.xml:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       style="@style/customActionBar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="?attr/colorPrimary" 
       android:minHeight="?attr/actionBarSize" 
       app:layout_scrollFlags="scroll|enterAlways"/> 

     </android.support.design.widget.AppBarLayout> 

     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

    </android.support.design.widget.CoordinatorLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@android:color/white" 
     app:headerLayout="@layout/navigation_drawer_header" 
     app:menu="@menu/navigation_items" /> 

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

fragment_main.xml:

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

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

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:clipToPadding="false" 
      android:padding="8dp" 
      android:scrollbars="none" /> 

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

</FrameLayout> 

Ther SwipeRefreshLayout jest w FrameLayout becuase istnieje kilka elementów we fragmencie w moim aplikacja.

Każda pomoc zostanie doceniona.

+0

Możliwy duplikat [Android: CollapsingToolbarLayout i SwipeRefreshLayout utknąć] (http://stackoverflow.com/questions/30779667/android -collapsingtoolbarlayout-and-swiperefreshlayout-get-stuck) –

+1

[Zostało to poprawione w bibliotece pomocy technicznej v23.1.1 bez żadnych obejść] (http://stackoverflow.com/a/33776549/383414) –

+0

@RichardLeMesurier Nie mam myślę, że jest całkowicie rozwiązany. Mam do czynienia z tym samym materiałem przy użyciu wersji 23.3. – zgulser

Odpowiedz

9

AKTUALIZACJA: Ten problem został rozwiązany w bibliotece pomocy technicznej v23.1.1.

Wygląda na to, że musisz włączyć/wyłączyć SwipeRefreshLayout, gdy zmieni się przesunięcie AppBarLayout, używając AppBarLayout.OnOffsetChangedListener.

Zobacz https://stackoverflow.com/a/30822119/795820

+0

proszę również odpowiedzieć na to: http://stackoverflow.com/questions/36434071/android-support-v4widget-swiperefreshlayout-working-but-it-is-not-visible –

+1

Powrót w 23.2.1 – k0sh

+0

Również w przypadku zagnieżdżony RecyclerView, sprawdź tutaj http://stackoverflow.com/a/36895607/1221256 – user1221256

9

może zbyt późno, ale może to pomóc żadnych nowych chętnych, wpadłem proste rozwiązanie dla tego. poprzez tworzenie niestandardowych class który rozciąga SwipeRefreshLayout można go używać wszędzie tam, gdzie istnieje AppBaLayout śledzić kod poniżej

public class MySwipeLayout extends SwipeRefreshLayout implements AppBarLayout.OnOffsetChangedListener { 
     private AppBarLayout appBarLayout; 

     public MySwipeLayout(Context context) { 
      super(context); 
     } 

     public MySwipeLayout(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     @Override 
     protected void onAttachedToWindow() { 
      super.onAttachedToWindow(); 
      if (getContext() instanceof Activity) { 
       appBarLayout = (AppBarLayout) ((Activity) getContext()).findViewById(R.id.appbar); 
       appBarLayout.addOnOffsetChangedListener(this); 
      } 
     } 

     @Override 
     protected void onDetachedFromWindow() { 
      if(appBarLayout!=null){ 
      appBarLayout.removeOnOffsetChangedListener(this); 
      appBarLayout = null; 
      } 
      super.onDetachedFromWindow(); 
     } 

     @Override 
     public void onOffsetChanged(AppBarLayout appBarLayout, int i) { 
      this.setEnabled(i == 0); 
     } 
    } 
+0

Ładne i czyste. Dzięki. –

+0

@ k0sh, proszę również odpowiedzieć na to: http://stackoverflow.com/questions/36434071/android-support-v4widget-swiperefreshlayout-working-but-it-is-not-visible –

+0

Ten rozwiązał mój problem –