3

J'ai RecyclerView dont la hauteur est définie sur wrap_content. Maintenant, je dois mettre en œuvre OnLoadMore mais il y a un problème. je,Android - OnLoadMore dans RecyclerView avec hauteur wrap_content

RecyclerView.OnScrollListener.onScrolled(RecyclerView recyclerView, int dx, int dy) 

Mais il ne soit pas invoqué parce que mon RecyclerView ne défile pas. Sa hauteur est de wrap_content.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/root_rtl" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/white"> 

    <include 
     android:id="@+id/tool_bar" 
     layout="@layout/toolbar" /> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/tool_bar"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      tools:context="com.yarima.msn.Activities.ProfileActivity"> 

      <FrameLayout 
       android:id="@+id/FRAGMENT_PLACEHOLDER" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="@color/white"> 

       <!-- Some Content That I want to scroll with recyclerview --> 
      </FrameLayout> 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/recyclerview_posts" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:scrollbars="vertical" 
       android:bellow="@id/FRAGMENT_PLACEHOLDER"/> 
     </RelativeLayout> 
    </ScrollView> 

</RelativeLayout> 

donc je dois utiliser une autre approche pour charger d'autres pages à RecyclerView. Je pense que la meilleure façon de faire cela, appelle l'événement onLoadMore lorsque le dernier élément de RecyclerView devient visible. J'ai déjà essayé de le faire à partir de la méthode onBindViewHolder dans l'adaptateur, mais toutes les pages chargées complètement.

if(getItemCount()-position == 1 && onLoadMoreListener != null){ 
    if (recyclerView != null) { 
     visibleItemCount = recyclerView.getChildCount(); 
     totalItemCount = recyclerView.getLayoutManager().getItemCount(); 
     firstVisibleItem = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); 
     if (loading) { 
      if (totalItemCount > previousTotal) { 
       loading = false; 
       previousTotal = totalItemCount; 
      } 
     } 
     if (!loading && (totalItemCount - visibleItemCount) 
       <= (firstVisibleItem + visibleThreshold)) { 
      loading = true; 
      onLoadMoreListener.onLoadMore(); 
     } 
    } 
} 

Quelle est la façon alternative à mettre en œuvre onLoadMore sans utiliser les événements de défilement?

Mise à jour:

Les RecyclerView fonctionne parfaitement avec android:layout_height:"wrap_content" et mes ScrollView défile en douceur.

Mise à jour 2:

Mon problème est quand votre taille RecyclerView est wrap_content, défilement des événements de RecyclerView ne peuvent être invoquées. J'ai donc besoin d'un moyen alternatif pour savoir quand mon RecyclerView atteint la fin de sa liste et implémenter l'événement OnLoadMore de cette façon.

Mise à jour 3

I simplifié xml avant je l'ai écrit en question ... En xml réel, il est ViewPager au lieu du RecyclerView. Et j'ai 4 onglets dans ce ViewPager que chaque onglet contient un RecyclerView avec des contenus différents. Au-dessus de ce ViewPager J'ai quelques informations sur l'utilisateur et je veux faire défiler tous ensemble. Donc, je mets cet en-tête et ViewPager dans un ScrollView et définir la hauteur de RecyclerView à wrap_content.

Vous pouvez consulter la page de profil d'instagram. Je veux que cette page fonctionne comme ça.

Il n'est pas possible d'afficher cette information dans l'en-tête de RecyclerView parce que de cette façon, je devrais ajouter cette information dans chaque RecyclerView dans tous les onglets.

+0

Quelle est la version de support de la bibliothèque Android que vous utilisez? – Ironman

+0

@Ironman 24.2.1 – K2evil

+0

Pourquoi avez-vous besoin de la hauteur 'RecyclerView' pour être' wrap_content'? –

Répondre

0

Vous devez garder votre ViewPager et votre RecyclerView dans un NestedScrollView. Le fichier XML final devrait ressembler à ceci.

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ViewPager/> 
    <RecyclerView/> 

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

et régler la hauteur de votre RecyclerView-match_parent.

Vous rencontrerez un autre problème ici. La page défilera automatiquement en bas lorsque le RecyclerView sera chargé. Mais il y a aussi une solution.

Ajout de android:descendantFocusability="blocksDescendants" à la disposition enfant dans NestedScrollView qui empêchera le défilement automatique vers le bas.

Si ce qui précède ne fonctionne pas, essayez de définir nestedScrollView.scrollTo(0, 0); à partir de votre code après que le RecyclerView est chargé avec des éléments.

+0

Merci ... Je vais essayer bientôt et vous faire connaître les résultats .. . – K2evil