web-dev-qa-db-fra.com

android: RecyclerView dans un ScrollView

J'ai un RecyclerView enveloppé dans un LinearLayout et cela fonctionne parfaitement comme prévu. Je peux voir toutes les données dans la variable RecyclerView telles que remplies. Jusqu'ici tout va bien.

Lorsque j'emballe la LinearLayout dans une ScrollView, la RecyclerView devient vide. Je ne vois rien à l'intérieur de RecyclerView. Pourquoi? Comment faire ce travail.

La page est l'un des onglets d'une ViewPagerIndicator, de sorte que tout cet onglet doit figurer dans une ScrollView.

Merci pour votre aide.

13
nomongo

Définissez cette propriété pour ScrollView,

 Android:fillViewport="true"

ScrollView s’étendra pour remplir le contenu

36
Sathesh

Après vérification de la mise en œuvre, la raison semble être la suivante. Si RecyclerView est placé dans une ScrollView, sa hauteur n'est pas spécifiée pendant le pas de mesure (car ScrollView permet n'importe quelle hauteur) et, par conséquent, est égale à la hauteur minimale (selon l'implémentation) qui est apparemment nulle.

Vous avez deux options pour résoudre ce problème:

  • Définissez une certaine hauteur sur RecyclerView
  • Définissez ScrollView.fillViewport sur true
  • Ou gardez RecyclerView en dehors de ScrollView. Je pense que c'est de loin la meilleure option. Si RecyclerView height n'est pas limité - ce qui est le cas lorsqu'il est placé dans ScrollView -, toutes les vues de l'adaptateur ont suffisamment de place verticalement et sont créées en une seule fois. Il n'y a plus de recyclage de vues, ce qui brise un peu l'objectif de RecyclerView.
22
sergej shafarenka

Rien ne m'a aidé sauf ceci:

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            rv.getParent().requestDisallowInterceptTouchEvent(true);
            break;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

J'ai eu cette réponse . Merci Piyush Gupta pour cela.

4
neustart47

espérons que cette aide 

Ajoutez cette ligne à votre recyclerView xml:

Android:nestedScrollingEnabled="false"

essayez-le, recyclerview se déroulera en douceur avec une hauteur flexible dans scrollview.

0
tahaDev

L'utilisation de RecyclerView dans ScrollView n'est pas une bonne pratique.

Lorsque RecyclerView encapsule son contenu, il ne recycle plus. Dans chaque enregistrement du jeu de données, une vue d'élément est conservée en mémoire tant que RecyclerView est dans la hiérarchie.

Lisez plus ici - https://Android.jlelse.eu/Android-dev-tip-4-91b7757b1f0a

0
yoAlex5