Oh garçon, oui, tu vas avoir des problèmes avec celui-là. Cela me rend fou que les ListViews et les GridViews ne puissent pas être étendues pour envelopper leurs enfants, parce que nous savons tous qu'elles ont des fonctionnalités plus bénéfiques en plus de leur défilement et du recyclage de leurs enfants.
Néanmoins, vous pouvez contourner ce problème ou créer votre propre disposition pour répondre à vos besoins sans trop de difficultés. Je pense à deux possibilités :
Dans ma propre application, j'ai intégré une ListView dans une ScrollView. J'ai fait cela en demandant explicitement à la ListView d'être exactement aussi haute que son contenu. Pour ce faire, je modifie les paramètres de mise en page à l'intérieur même de la fonction ListView.onMeasure()
de la manière suivante :
public class ExpandableListView extends ListView {
boolean expanded = false;
public ExpandableListView(Context context, AttributeSet attrs, int defaultStyle) {
super(context, attrs, defaultStyle);
}
public boolean isExpanded() {
return expanded;
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// HACK! TAKE THAT ANDROID!
if (isExpanded()) {
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
} else {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
Cela fonctionne parce que lorsque vous donnez à la ListView un mode de AT_MOST
il crée et mesure tous ses enfants pour vous, à l'intérieur même de l'application. onMeasure
(j'ai découvert cela en parcourant le code source). Espérons que le GridView se comporte de la même manière, mais si ce n'est pas le cas, vous pouvez toujours mesurer tout le contenu du GridView vous-même. Mais ce serait plus facile si vous pouviez inciter le GridView à le faire pour vous.
Maintenant, vous devez garder à l'esprit que cette solution désactiverait complètement le recyclage des vues qui rend GridView si efficace, et toutes ces ImageViews seront en mémoire même si elles ne sont pas visibles. Il en va de même avec ma prochaine solution.
L'autre possibilité est de laisser tomber le GridView et de créer votre propre mise en page. Vous pouvez étendre soit AbsoluteLayout
o RelativeLayout
. Par exemple, si vous étendez RelativeLayout
vous pourriez placer chaque image LEFT_OF
la précédente, en tenant compte de la largeur de chaque image jusqu'à ce que vous n'ayez plus de place sur cette rangée, puis commencez la rangée suivante en plaçant la première image de la nouvelle rangée BELOW
l'image la plus haute de la dernière rangée. Pour centrer les images horizontalement ou les placer dans des colonnes équidistantes, vous devrez vous donner encore plus de mal. Peut-être qu'AbsoluteLayout est meilleur. Dans tous les cas, c'est assez pénible.
Bonne chance.
0 votes
Le nombre d'images est-il fixe ou peut-il varier ?
0 votes
Avez-vous défini Android:layout_height="wrap_content" pour le GridView lorsque vous avez essayé de désactiver sa fonctionnalité de défilement ?
0 votes
Pearsonartphoto : Le nombre d'images varie.
0 votes
MisterSquonk : Oui, cela ne fonctionne pas. De plus, les GridViews à l'intérieur des ScrollViews ne sont pas considérés comme kasher d'après ce que j'ai lu. Par exemple, Romain Guy écrit : "ListView et GridView ne sont pas censés être intégrés l'un dans l'autre (il en va de même pour ScrollView.) Et quand je dis qu'ils ne sont pas censés, c'est qu'ils ne sont pas supportés pour le faire." J'ai mis à jour le post original avec une capture d'écran pour montrer à quoi cela ressemble avec les barres de défilement désactivées et ndroid:layout_height défini sur "wrap_content".
1 votes
Romain Guy aurait dû inclure un addHeader() dans le GridView. Il ne l'a pas fait, donc, nous devons le pirater ! !