ce que je veux réaliserRecyclerView horizontale avec des hauteurs d'éléments variables non emballage correctement
La vue de l'élément doit occuper toute la hauteur de l'élément
Il pourrait soit que la hauteur de l'objet soit inférieure à la hauteur de l'objet le plus haut dans le recyclerview, auquel cas il devrait juste coller au sommet comme dans la capture d'écran ci-dessus.
Le bug que je cours dans
Comme dans la capture d'écran ci-dessus, les vues sont tronquées se.
Ce que j'ai essayé jusqu'à présent
Au départ, je suis allé avec wrap_content sur le recyclerview, maintenant qu'il est pris en charge. Cela n'a pas fonctionné quand aucune des vues visibles à l'écran n'était la plus grande. Cela a du sens dans la façon dont la hiérarchie des vues est présentée. Comment peut-on calculer la hauteur de quelque chose qui n'a pas encore été lié à des données si la hauteur dépend de ces données?
temps Solution: S
Au lieu d'essayer un LayoutManager personnalisé, je suis allé avec ce que je ressentais qu'il fallait faire - la pose sur toutes les vues de l'objet au début de comprendre leur hauteur.
Il y a une barre de progression et une animation qui joue dans la partie supérieure de l'écran pour attirer l'attention de l'utilisateur pendant que tout cela se produit avec la visibilité recycleless définie sur invisible. J'utilise deux choses, une n'a pas suffi - j'ai joint un observateur dans l'appel onViewAttached()
de l'adaptateur et j'ai aussi utilisé un écouteur de changement de défilement. Il y a un LinearSnapHelper attaché à la vue recycleur pour s'accrocher à la position adjacente (suivant ou précédent, selon la direction de défilement) lors du défilement.
Dans cette configuration,
- Je vais à chaque position dans le recyclerview en utilisant
layoutManager.smoothScrollToPosition()
Obtenir la hauteur de vue de l'enfant en utilisant
View currentChildView = binding.nextRv.getChildAt(layoutManager.findFirstCompletelyVisibleItemPosition()); if (currentChildView != null) { currentChildHeight = currentChildView.getHeight(); }
en défilement changement écoute sur RecyclerView.SCROLL_STATE_IDLE
ou en passant la hauteur à l'observateur ci-joint vu ci-dessus dans l'onVie de l'adaptateur wAttachedToWindow()
@Override
public void onViewAttachedToWindow(BindingViewHolder holder) {
if (mObserver != null) {
mObserver.onViewAttached(holder.binding.getRoot().getHeight());
}
}
- Enregistrement d'un
maxHeight
qui change au maximum de maxHeight et la hauteur de nouvel enfant.
Comme il est évident, c'est moche. De plus, il ne me donne pas la hauteur de la vue actuelle - sur Attaché signifie qu'il est seulement juste attaché, non mesuré et aménagé. C'est la vue recyclée, pas la vue liée à l'élément de données actuel. Ce qui présente des problèmes comme la troncature de vue illustrée ci-dessus.
J'ai aussi essayé la hauteur de wrap_content sur la vue recycleur et invalidante du parent de recycleur jusqu'à ce que le recycleur et l'enfant sur parchemin venant SCROLL_STATE_IDLE. Ne fonctionne pas Je ne suis pas sûr de la façon dont un gestionnaire de disposition personnalisé peut aider ici.
Quelqu'un peut-il me guider dans la bonne direction?
pouvez-vous ajouter votre fichier xml – Redman
S'il vous plaît le trouver [ici] (https://gist.github.com/adroitandroid/85e7a66d7f796379649c2d9eab26cf76) –
Le recyclerview en question est celui avec id "next_rv".En fait pour la solution détaillée ci-dessus, initialement je l'ai mis à hauteur match_parent et plus tard réinitialiser la hauteur à la 'maxHeight' obtenu –