2017-05-25 2 views
4

Je suis en train d'implémenter un APi Retrofit pour obtenir des données du serveur et les afficher dans un RecyclerView en utilisant le framework Litho, et ça se passe bien. Comme nous le savons tous quand nous avons des données infinies à afficher dans recyclerview, nous devons mettre en œuvre le modèle de pagination. Et je sais cela, mais je suis confus comment mettre en œuvre cela dans le cadre de Litho. Litho la méthode fournit onScrollListener():Comment effectuer une pagination avec le framework Litho?

final Component component = Recycler.create(context) 
    .binder(recyclerBinder) 
    .onScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
      // 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      // 
     }) 
    .build(); 

Je ne sais pas: comment utiliser un EndlessRecyclerViewScrollListener sur mesure pour le défilement sans fin Litho?

Répondre

1

J'ai réussi à implémenter le modèle de défilement "infini" en utilisant le recyclerBinder dans la méthode onScrolled d'un OnScrollListener. Un exemple trivial serait la suivante:

//Initialize the RecyclerBinder 
recyclerBinder = new RecyclerBinder(c, new LinearLayoutInfo(getContext(), OrientationHelper.VERTICAL, false)); 

//Initialize a recycler component 
Component component = Recycler.create(c) 
       .onScrollListener(new RecyclerView.OnScrollListener() { 
        @Override 
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
         super.onScrolled(recyclerView, dx, dy); 

         // use the recyclerBinder to determine what items at what position are visible - 
         // (you could also use the findLastVisibleItemPosition() method depending on your implementation) 
         int firstVisibleItemPosition = recyclerBinder.findFirstVisibleItemPosition(); 

         //check if it is within range relative to the current available items and is not loading (room to improve/modify logic pending use case) 
         if((recyclerBinder.getItemCount() - 5) <= firstVisibleItemPosition && !isLoading) { 
          //if so - use your service to get the next page 
          service.getNextPage(); 
         } 
        } 
       }) 
       .build(); 

Puis, dans un rappel méthode - vous pouvez insérer vos articles à partir de l'élément compter

public void callback(List<T> results) { 
    int position = recyclerBinder.getItemCount(); 
    for(T result: results) { 
     Component component = //assemble your component(s) ... 
     ComponentInfo.Builder info = ComponentInfo.create().component(component); 
     recyclerBinder.insertItemAt(position, info.build()); 
     position++; 
    } 
} 
+0

merci pour répondre, dans 'onScrolled (RecyclerView recyclerView, int dx, int dy) 'méthode que vous appelez' service.getNextPage(); 'je n'ai pas compris,' getNextPage() 'est une méthode personnalisée? –

+0

@HussainKhan - oui - c'est ici que vous devez appeler pour aller chercher la prochaine page de données, peut-être un appel à votre service de retrofit en incrémentant le numéro de page de votre API. – syllabix

+0

Merci, résolu mon problème, bonne réponse –