web-dev-qa-db-fra.com

RecyclerView dans ScrollView, certains éléments ne sont pas affichés

J'ai eu un RecyclerView dans ScrollView comme ceci:

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <!--other stuff-->

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.RecyclerView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:visibility="gone"/>

    </LinearLayout>

    <!--other stuff-->

</ScrollView>

Et l'élément de RecyclerView est un RelativeLayout, à l'intérieur duquel se trouvent un EditText et d'autres vues. Le layout_height De ce RelativeLayout et EditText est à la fois wrap_content. L'utilisateur peut entrer dans ce EditText sans aucune limite de longueur/lignes afin que la hauteur de chaque élément soit différente.

Ensuite, j'ai trouvé que getItemCount() dans Adapter renvoie la vraie valeur mais onBindViewHolder() est appelé de mauvais moments (moins qu'il ne devrait l'être), donc pas assez pour afficher tous les éléments.

J'ai trouvé que cela ne se produira que si j'écris recyclerView.setNestedScrollingEnabled(false). Mais je ne peux pas supprimer cette ligne. Parce que si je le faisais, le RecyclerView ne défilerait pas facilement et ne serait pas harmonieux avec les autres vues à l'intérieur de ScrollView et ScrollView lui-même.

Cela se produit sur 6.0 mais pas sur 4.1.

J'ai communiqué avec Google sur cette page: https://code.google.com/p/Android/issues/detail?id=213914 et il m'a dit qu'il s'agissait d'un correctif de bogue pour RecyclerView. Vous pouvez visiter cette page afin de mieux comprendre la question et mon objectif (il y a un petit exemple de projet pour y montrer le problème). Je ne suis pas encore d'accord avec lui et je veux résoudre le problème. Aidez-moi, merci d'avance.

17
ywwynm

J'ai trouvé la solution moi-même: remplacez ScrollView par NestedScrollView et conservez recyclerView.setNestedScrollingEnabled(false). Je ne sais pas si c'est pour ça que NestedScrollView est fait mais ça marche.

AVIS:

  1. NestedScrollView n'est pas un enfant de ScrollView mais de FrameLayout.
  2. Cette solution apportera également quelques bogues avec adjustResize auto-simulé.
79
ywwynm