Question Comment créer un RecyclerView circulaire (sans fin)?


J'essaie de faire mon RecyclerView retournez au début de ma liste.

J'ai cherché partout sur Internet et j'ai réussi à détecter quand j'ai atteint la fin de ma liste, mais je ne sais pas où procéder à partir de là.

C'est ce que j'utilise actuellement pour détecter la fin de la liste (trouvé ici):

 @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

        visibleItemCount = mLayoutManager.getChildCount();
        totalItemCount = mLayoutManager.getItemCount();
        pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

        if (loading) {
            if ( (visibleItemCount+pastVisiblesItems) >= totalItemCount) {
                loading = false;
                Log.v("...", ""+visibleItemCount);
            }
        }
 }

Lorsque vous faites défiler jusqu'à la fin, je voudrais que les vues soient visibles lors de l'affichage des données en haut de la liste ou en haut de la liste pour afficher les données en bas de la liste.

Par exemple:

Voir1 View2 View3 View4 View5

View5 View1 View2 View3 View4


21
2017-07-06 18:59


origine


Réponses:


Il n'y a aucun moyen de le rendre infini, mais il y a un moyen de le rendre infini.

  1. dans votre remplacement d'adaptateur getCount() retourner quelque chose de grand comme Integer.MAX_VALUE:

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }
    
  2. dans getItem() et getView() modulo divise (%) position par numéro d'article réel:

    @Override
    public Fragment getItem(int position) {
        int positionInList = position % fragmentList.size();
        return fragmentList.get(positionInList);
    }
    
  3. à la fin, définissez l'élément actuel sur quelque chose au milieu (ou sinon, il ne serait infini que dans le sens descendant).

    // scroll to middle item
    recyclerView.getLayoutManager().scrollToPosition(Integer.MAX_VALUE / 2);
    

45
2017-07-06 19:34



Les autres solutions que j'ai trouvées pour ce problème fonctionnent assez bien, mais je pense que certains problèmes de mémoire pourraient renvoyer Integer.MAX_VALUE dans la méthode getCount () de la vue recycleur.

Pour corriger cela, remplacez la méthode getItemCount () comme suit:

@Override
public int getItemCount() {
    return itemList == null ? 0 : itemList.size() * 2;
}

Maintenant, où que vous utilisiez la position pour obtenir l'article de la liste, utilisez ci-dessous

position % itemList.size()

Maintenant, ajoutez scrollListener à votre vue recycleur

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
        super.onScrolled(recyclerView, dx, dy);
        int firstItemVisible = linearLayoutManager.findFirstVisibleItemPosition();
        if (firstItemVisible != 0 && firstItemVisible % itemList.size() == 0) {
            recyclerView.getLayoutManager().scrollToPosition(0);
        }
    }
});

Enfin, pour lancer le défilement automatique, appelez la méthode ci-dessous

public void autoScroll() {
    final Handler handler = new Handler();
    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            recyclerView.scrollBy(2, 0);
            handler.postDelayed(this, 0);
        }
    };
    handler.postDelayed(runnable, 0);
}

10
2017-07-15 04:17