GridView lignes qui se chevauchent: comment faire de la hauteur de ligne fit le plus grand élément?
Comme cette personne précédente, j'ai indésirables de chevauchement entre les éléments GridView:
Avis le texte, dans chaque colonne, à l'exception de la plus à droite.
Où je diffère de celle de la question précédente, c'est que je ne veux pas d'une constante de la hauteur de ligne. Je veux la hauteur de ligne à varier à accueillir le plus grand contenu dans chaque ligne, pour une utilisation efficace de l'espace à l'écran.
À la recherche à la source pour GridView (pas la copie faisant autorité, mais kernel.org est toujours à la baisse), nous pouvons voir dans fillDown() et makeRow() le dernier point de Vue vu est la "vue de référence": la ligne de hauteur est définie à partir de la hauteur de ce point de Vue, pas de la plus haute un. C'est ce qui explique pourquoi la colonne la plus à droite est ok. Malheureusement, GridView n'est pas bon pour moi de résoudre ce problème en héritage. Tous les champs pertinents et les méthodes sont privés.
Donc, avant que je prenne le bien-porte bloaty chemin de "clone et propre", est-il un truc qui me manque ici? Je pourrais utiliser un TableLayout, mais cela m'obligerait à mettre en œuvre numColumns="auto_fit"
moi-même (puisque je veux par exemple, juste une longue colonne sur un écran de téléphone), et elle aussi ne serait pas un AdapterView, ce qui se sent comme elle devrait l'être.
Edit: en fait, clone et propre n'est pas pratique ici. GridView dépend des parties inaccessibles de ses parents et de la fratrie des classes, et aurait pour conséquence de l'importation d'au moins 6000 lignes de code (AbsListView, AdapterView, etc.)
- Pour la fixation de la Hauteur, ce lien peut être une solution: stackoverflow.com/questions/11411472/...
- C'est mieux d'utiliser recycler vue. Il va gérer ce genre de chose correctement.
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé un tableau statique à disque max hauteurs de la ligne. Ce n'est pas parfait, car le plus tôt colonnes ne sera pas redimensionnée jusqu'à ce que la cellule est réaffiché. Voici le code pour le gonflés de contenu réutilisable vue.
Modifier: j'ai eu ce travail correctement, mais j'avais pré-mesurer toutes les cellules avant le rendu. Je l'ai fait en sous-classement GridView et l'ajout d'une mesure de crochet dans le onLayout méthode.
Ici est la fonction de mesure dans mon BaseAdapter sous-classe. Notez que j'ai une méthode
updateItemDisplay
qui définit toutes les mesures de texte et d'images sur le point de vue de la cellule.Et enfin, voici le GridView sous-classe mis en place pour mesurer la vue de cellules au cours de la mise en page:
La raison pour laquelle j'ai le nombre de colonnes que la ressource afin que je puisse avoir un nombre différent basé sur l'orientation, etc.
Basée sur les informations de Chris, j'ai utilisé cette solution de contournement, faisant usage de la référence de la Vue utilisée par les indigènes GridView lors de la détermination de la hauteur des autres éléments GridView.
J'ai créé ce GridViewItemContainer classe personnalisée:
Dans votre adaptateur getView méthode, soit l'enveloppe de votre convertView comme un enfant dans un nouveau GridViewItemContainer ou de faire de cette le haut de l'élément XML de votre élément de mise en page:
Où numColumns est le nombre de colonnes dans le contrôle GridView et "viewsInRow" est une liste de point de Vue sur la ligne actuelle, d'où la position est situé.
Je l'ai fait de nombreuses recherches mais trouvé de réponse incomplète ou avait difficiles à comprendre ce qui se passe avec la solution mais enfin trouvé une réponse qui cadrent parfaitement avec les explications appropriées.
Mon problème était de faire entrer gridview élément en hauteur correctement. Cette
Grid-view
a très bien fonctionné lors de tous vos points de vue sont de la même hauteur. Mais quand vos points de vue ont des hauteurs différentes, la grille ne se comporte pas comme prévu. Des points de vue se superposent les uns aux autres, ce qui provoque unean-aesthetically
agréable grille.Ici Solution j'ai utilisé cette classe dans le XML de mise en page.
J'ai utilisé cette solution, et cela fonctionne très bien, merci beaucoup.--Abhishek Mittal
Si vous convertissez votre GridView ou ListView à un RecyclerView, ce problème ne se produira pas. Et vous n'aurez pas besoin de faire un custom classe GridView.
Donner du poids à votre GridView travaille également sur GridViews à l'intérieur de LinearLayouts comme un enfant. De cette façon, GridView remplit la fenêtre avec ses enfants de sorte que vous êtes en mesure d'afficher les articles tant qu'ils s'inscrivent à l'écran (défilement).
Mais toujours éviter d'utiliser GridViews à l'intérieur de ScrollViews. Sinon, vous aurez besoin de calculer la taille de chaque enfant et de les réaffecter comme Chase répondu ci-dessus.