1

При обновлении страницы facebook, то SwipeRefreshLayout, как представляется, в пределах класса активности и идет вниз от верхней части экрана:Реализация SwipeRefreshLayout активности для фрагмента

swipetorefresh

Что усматривать RecyclerView под ним обновляется. Вам также потребуется прокрутить весь путь до верхней части экрана до того, как SwipeRefreshLayout активирует себя - так что если в верхней части экрана не появится ImageView, тогда, когда вы прокрутите вниз, вы на самом деле просто прокрутка RecyclerView. На скриншоте ниже мы видим, что верхняя ImageView не видна, поэтому мы просто прокручиваем наш recyclerview.

below is a scroll

Я пытаюсь реализовать что-то подобное в моем приложении, выполнив следующие действия в XML, который похож на первый скриншот Facebook я написал выше - моя деятельность имеет «swipeRefresh значок круга» выходит из верхний и соответствует стандартной компоновки XML для создания toolbar с ImageView:

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ XML:

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

    <android.support.design.widget.CoordinatorLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/coordinatorlayout" 
     > 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/appbar" 
      > 

      <android.support.design.widget.CollapsingToolbarLayout 
       android:id="@+id/collapsing_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:contentScrim="?attr/colorPrimary" 
       android:background="@color/white" 
       app:expandedTitleTextAppearance="@color/transparent" 
       app:layout_scrollFlags="scroll|exitUntilCollapsed" 
       > 

        <ImageView 
         android:id="@+id/backdrop" 
         android:contentDescription="@string/photo" 
         android:layout_width="match_parent" 
         android:background="@color/white" 
         android:layout_height="192dp" 
         android:scaleType="centerCrop" 
         android:fitsSystemWindows="true" 
         /> 

       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        app:layout_collapseMode="pin"/> 

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

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

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

       <android.support.v4.widget.NestedScrollView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:fillViewport="true" 
        > 
       </android.support.v4.widget.NestedScrollView> 

      </FrameLayout> 

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

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

Однако, SwipeRefreshLayout берет на себя всю деятельность, включая любые действия прокрутки в моем Fragment, которые я надуваю в своем FrameLayout, вложенном в мой основной вид деятельности xml. Fragment, который я надуваю, это RecyclerView, который прокручивается вверх и вниз, подобно RecyclerView.

Чтобы уйти от этой проблемы, я знаю, что я могу просто удалить SwipeRefreshLayout из моего Activity XML и положил его с моей Fragment XML, но тогда мой значок SwipeRefresh круга начнется только к концу экрана вместо Вверх.

Не знаете, как Facebook удалось остановить SwipeRefreshLayout от получения полного фокуса для всех действий прокрутки - кто-нибудь знает, как они реализовали свои SwipeRefreshLayout?

Это мой фрагмент кода XML:

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

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/post_container" 
     android:background="#E0E0E0"> 

     <ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/progresswheel" 
      android:layout_margin="32dp" 
      android:layout_centerHorizontal="true" 
      android:visibility="gone" 
      tools:visibility="visible"/> 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/my_recycler_view" 
       android:scrollbars="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
      </android.support.v7.widget.RecyclerView> 

    </RelativeLayout> 

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

поместите 'SwipeRefreshLayout' в свой' Фрагмент' не в 'Активность' как родительский. –

+0

yes - как я уже упоминал, что в моем вопросе, но это не самый предпочтительный вариант, так как салфетки для обновления круга начнутся посередине страницы, а не вверху. – Simon

+0

Возможно, вы делаете это неправильно. Пожалуйста, разместите полный код, включая фрагмент. –

ответ

2

OK - я, наконец, понял это.

Это не просто, но решение на самом деле вывести класс фрагмента и заменить его обычным recyclerview.

В XML:

<?xml version="1.0" encoding="utf-8"?> 


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

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

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/appbar" 
      android:fitsSystemWindows="true" 
      > 
      <android.support.design.widget.CollapsingToolbarLayout 
       android:id="@+id/collapsing_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       app:contentScrim="?attr/colorPrimary" 
       android:background="@color/white" 
       app:expandedTitleMarginStart="48dp" 
       app:expandedTitleMarginEnd="64dp" 
       android:fitsSystemWindows="true" 
       app:expandedTitleTextAppearance="@color/transparent" 
       app:layout_scrollFlags="scroll|exitUntilCollapsed" 
       > 

        <ImageView 
         android:layout_width="match_parent" 
         android:layout_height="300dp" 
         android:scaleType="centerCrop" 
         android:fitsSystemWindows="true" 
         android:id="@+id/photo" 
         app:layout_collapseMode="parallax" 
         android:src="@drawable/hand_gestures"/> 

       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        app:layout_collapseMode="pin"/> 


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

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

     <android.support.v7.widget.RecyclerView 
      android:layout_width="match_parent" 
      android:fitsSystemWindows="true" 
      android:fillViewport="true" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      android:layout_height="match_parent" 
      android:id="@+id/recyclerview"> 

     </android.support.v7.widget.RecyclerView> 

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

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

Затем вам нужно будет следовать решение по этой теме: Android: CollapsingToolbarLayout and SwipeRefreshLayout get stuck получить swipeToRefreshLayout работает должным образом.

Вы можете сделать это путем реализации следующего - скопировано из потока:

в вашем фрагменте/активности делает его реализацию AppBarLayout.OnOffsetChangedListener (сейчас освежающее включена, когда панель полностью расширена):

@Override 
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
    if (collapsingToolbarLayout.getHeight() + verticalOffset < 2 * ViewCompat.getMinimumHeight(collapsingToolbarLayout)) { 
     swipeRefreshLayout.setEnabled(false); 
    } else { 
     swipeRefreshLayout.setEnabled(true); 
    } 
} 

Override OnPause() & onResume(), как в @blackcj ответ:

@Override общественного недействительными onResume() { супер .onResume(); appBarLayout.addOnOffsetChangedListener (this); }

@Override 
public void onPause() { 
    super.onPause(); 
    appBarLayout.removeOnOffsetChangedListener(this); 
} 

Затем установите LinearLayoutManager вашего recyclerView:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(layoutManager); 

Для меня это работало как шарм, первый appBarlayout получает расширяется и только тогда swipeRefreshLayout запускает освежающим.

 Смежные вопросы

  • Нет связанных вопросов^_^