0

Un problème est survenu lors de l'activation incohérente de RecyclerView SwipeRefreshLayout sur un simulateur Nexus 6P API 25 7.1.1. Nous sommes sur les dernières versions des bibliothèques de support:SwipeRefreshLayout ne fonctionne plus/Récupération incohérente des déclenchements par RecyclerView SwipeRefreshLayout

compile 'com.android.support:recyclerview-v7:25.3.1' 
compile 'com.android.support:appcompat-v7:25.3.1' 
compile 'com.android.support:design:25.3.1' 
compile 'com.android.support:support-v4:25.3.1' 

J'ai un RecyclerView avec un ensemble de données qui obtient préfixé lorsque la traction pour rafraîchir se produit (ajout d'éléments vers le haut), il est déclaré dans ma mise en page comme ceci:

<android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/swipeRefresh" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 
     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recyclerView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" /> 
</android.support.v4.widget.SwipeRefreshLayout> 

Je suis en mesure de déclencher le geste environ 2-3 fois, l'ajout d'éléments à la RecyclerView, mais il ne me permet de déclencher l'attraction de rafraîchissement. Nous n'appelons jamais SwipeRefreshLayout.setEnabled (false). Il semble que RecyclerView répond en interne true à canScrollVertically (-1) même si nous sommes en haut de la liste des éléments.

La seule chose intéressante au sujet de notre traitement est nous remplaçons le gestionnaire de mise en page de RecyclerView pour nous faire défiler en bas:

LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setStackFromEnd(true); // Start with most recent messages (enables scroll-to-bottom) 
recyclerView.setLayoutManager(llm); 

Répondre

0

En View, le code qui calcule canScrollVertically(-1) dépend des résultats de computeVerticalScrollOffset, computeVerticalScrollRange et computeVerticalScrollExtent.

Le RecyclerView repose sur le LinearLayoutManager pour effectuer ces calculs. Cela transmet à ScrollbarHelper qui fait quelques approximations si smoothScrollbarEnabled est true (la valeur par défaut) afin d'afficher une barre de défilement de fantaisie.

Si les articles de votre RecyclerView sont de tailles différentes, ces approximations seront totalement fausses.

LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setSmoothScrollbarEnabled(false); 
recyclerView.setLayoutManager(llm); 

Résolu notre problème et a obtenu le SwipeRefreshLayout pour déclencher de manière fiable chaque fois que nous sommes arrivés au sommet de la liste.