2016-01-30 19 views
15

Użyłem SwipeRefreshLayout z widokiem recyclerview, działa dobrze na wszystkich wersjach Androida, ale w Kitkat, kiedy ściągam, a następnie SwipeRefreshLayout loader nie będzie się rozwijał, a także nie odświeża danych z recyclerview, ale pracuje w lizakSwipeRefreshLayout loader nie będzie działać podczas ściągania androida

używam 'com.android.support:support-v4:22.2.1'

Edycja 1

SwipeRefreshLayout swipe_refresh; 
swipe_refresh = (SwipeRefreshLayout)rootView.findViewById(R.id.swipe_refresh); 

swipe_refresh.post(new Runnable() { 
      @Override 
      public void run() { 
       swipe_refresh.setRefreshing(true); 
      } 
     }); 


swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       // Loading more data.. 
       ..... 
       .... 
       getData(); 

      } 
     }); 

swipe_refresh.setColorSchemeResources(android.R.color.holo_blue_bright, 
       android.R.color.holo_green_light, 
       android.R.color.holo_orange_light, 
       android.R.color.holo_red_light); 

public void getData(){ 
    // Load data from web service... 
    ... 
    ... 
    ... 


    // After loading 
    swipe_refresh.setRefreshing(false); 

    // Set data to adapter 
} 

Kod Układ

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/swipe_refresh" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:background="@color/grey_100"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/gv_feeds" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_weight="9" 
       android:scrollbars="vertical"/> 

      <ProgressBar 
      android:id="@+id/prog_load_more" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_gravity="center_horizontal" 
      android:visibility="gone"/> 

      </LinearLayout> 

     </FrameLayout> 

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

Czy nazywasz swipeRefreshLayout. setRefreshing (fałsz); kiedy ładowanie danych jest zakończone? –

+0

Tak, jestem .. kiedy ponownie się podniosę, aby odświeżyć, a następnie utknął na ekranie, mogę wyciągnąć go przeciągając ... –

+0

Czy możesz dołączyć kod? –

Odpowiedz

0

spróbować ten sposób

listView.setOnScrollListener(new OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
     boolean enable = false; 
     if(listView != null && listView.getChildCount() > 0){ 
      // check if the first item of the list is visible 
      boolean firstItemVisible = listView.getFirstVisiblePosition() == 0; 
      // check if the top of the first item is visible 
      boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0; 
      // enabling or disabling the refresh layout 
      enable = firstItemVisible && topOfFirstItemVisible; 
     } 
     swipeRefreshLayout.setEnabled(enable); 
    }}); 
2

ja zanim miał ten sam problem. Wydaje się, że nie masz swojego RecyclerView jako bezpośredniego potomka SwipeRefreshLayout.

Naprawiliśmy ten problem za pomocą niestandardowego SwipeRefreshLayout jak ten:

public class FixedSwipeRefreshLayout extends SwipeRefreshLayout { 

    private RecyclerView recyclerView; 

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

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

    public void setRecyclerView(RecyclerView recyclerView) { 
     this.recyclerView = recyclerView; 
    } 

    @Override 
    public boolean canChildScrollUp() { 
     if (recyclerView!=null) { 
      return recyclerView.canScrollVertically(-1); 
     } 

     return false; 
    } 

} 

Następnie, zamiast korzystania android.support.v4.widget.SwipeRefreshLayout użyć własnego 'com.example.app.FixedSwipeRefreshLayout' tak:

<?xml version="1.0" encoding="utf-8"?> 
<com.example.app.FixedSwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/swipe_refresh" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
... 
</com.example.app.FixedSwipeRefreshLayout> 

i wreszcie, gdy pojawi się uchwyt swojej SwipeRefreshLayout użyć niestandardowego jeden i ustawić RecyclerView:

FixedSwipeRefreshLayout swipe_refresh; 
swipe_refresh = (FixedSwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh); 
RecyclerView mRecyclerView = (RecyclerView) rootView.findViewById(R.id.gv_feeds); 
swipe_refresh.setRecyclerView(mRecyclerView); 

Mam nadzieję, że to pomoże.

1

Zgodnie swipeRefreshDocumentation SwipeRefreshLayout nie dobrze bawić się z układu, które nie są przewijane jeśli dodana wewnątrz niego: masz 2 rozwiązanie tego problemu:

1) Zmień swój wygląd, aby swipeRefreshLayout mieć bezpośredni dziecko jako recyclerView.

coś takiego:

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

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:id="@+id/ll_HeaderProgress" 
     android:background="@color/white_color_30"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 
      <android.support.v4.widget.SwipeRefreshLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/swipe_refresh" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="0dp" 
       android:layout_weight="9" 
       > 
      <android.support.v7.widget.RecyclerView 
       android:id="@+id/recyclerview_buzz" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:scrollbars="vertical"/> 
</android.support.v4.widget.SwipeRefreshLayout> 
      <ProgressBar 
       android:id="@+id/ll_footerProgress" 
       android:layout_width="40dp" 
       android:layout_height="40dp" 
       android:layout_gravity="center_horizontal" 
       android:visibility="gone"/> 
     </LinearLayout> 
    </FrameLayout> 

2) Extend SwipeRefreshLayout ze słuchaczem, aby móc dodawać różne warunki z klas, które wyświetlają ten układ.

Coś jak następuje: RefreshSwipeRefreshLayout.java

public class RefreshSwipeRefreshLayout extends SwipeRefreshLayout { 
    private OnChildScrollUpListener mScrollListenerNeeded; 

    public interface OnChildScrollUpListener { 
    boolean canChildScrollUp(); 
    } 

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

/** 
    * Listener that controls if scrolling up is allowed to child views or not 
    */ 
    public void setOnChildScrollUpListener(OnChildScrollUpListener listener) { 
    mScrollListenerNeeded = listener; 
    } 

    @Override 
    public boolean canChildScrollUp() { 
    if (mScrollListenerNeeded == null) { 
     Log.e(GeneralSwipeRefreshLayout.class.getSimpleName(), "listener is not defined!"); 
    } 
    return mScrollListenerNeeded != null && mScrollListenerNeeded.canChildScrollUp(); 
    } 
} 

a następnie zrobić to w klasie, który wyświetla SwipeRefreshLayout zawierający układ recyclerView, można zrobić coś takiego:

mSwipeLayout.setOnChildScrollUpListener(new OnChildScrollUpListener() { 
    @Override 
    public boolean canChildScrollUp() { 
    return ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition().getFirstVisiblePosition() > 0 || 
      mRecyclerView.getChildAt(0) == null || 
      mRecyclerView.getChildAt(0).getTop() < 0; 
    } 

});

Nie zapominaj także, aby zmienić go w xml

0

mogę być późno na to odpowiedzieć, ale miałem ten sam problem, wszystko zrobiłem to dodać:

swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
    @Override 
    public void onRefresh() { 
     // Loading more data.. 
     ..... 
     .... 
     getData(); 

     //make sure to set it to false as this will be set it to true when onRefresh is triggered 
     swipe_refresh.setRefreshing(false); 
    } 
}); 
Powiązane problemy