63 votes

Grille d'images dans un ScrollView

J'essaie de créer un écran contenant à la fois du texte et des images. Je veux que les images soient disposées comme une grille, comme indiqué ci-dessous, mais je veux qu'elles n'aient pas de fonctionnalité de défilement autre que celle fournie par la ScrollView environnante.

Une image illustrera mieux ma question :

alt text

<ScrollView>
    <LinearLayout>
        <ImageView />
        <TextView />
        <GridView />
        <TextView />
    </LinearLayout>
</ScrollView>

Quelle est la meilleure façon d'afficher une grille contenant un nombre variable d'images, lorsque la grille n'a pas de fonction de défilement ?

Veuillez noter que la désactivation de la fonction de défilement pour le GridView ne fonctionne pas, car elle ne fait que désactiver les barres de défilement mais n'affiche pas tous les éléments.

Mise à jour : L'image ci-dessous montre ce à quoi cela ressemble avec les barres de défilement désactivées dans le GridView.

alt text

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.

0voto

Essayez ceci

 public static void setGridViewHeightBasedOnChildren(GridView gridView, int columns) {
        ListAdapter listAdapter = gridView.getAdapter();
        if (listAdapter == null)
            return;
        int desiredWidth = View.MeasureSpec.makeMeasureSpec(gridView.getWidth(), View.MeasureSpec.UNSPECIFIED);
        int totalHeight = 0;
        View view = null;
        int rows = listAdapter.getCount() / columns;
        if(listAdapter.getCount() % columns> 0){
            rows++;
        }
        for (int i = 0; i < rows; i++) {
            view = listAdapter.getView(i, view, gridView);
            if (i == 0)
                view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LinearLayout.LayoutParams.WRAP_CONTENT));

            view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
            totalHeight += view.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = gridView.getLayoutParams();
        params.height = totalHeight + (gridView.getHorizontalSpacing() * rows);
        gridView.setLayoutParams(params);
        gridView.requestLayout();
    }

0voto

Sarith NOB Points 63

Pour un GridView avec d'autres vues à l'intérieur du ScrollView sauvegardé pour faire défiler le tout, allez sur ce lien : http://www.londatiga.net/it/programming/Android/make-Android-listview-gridview-expandable-inside-scrollview/#comment-3967742 . Il est utile et m'a permis de gagner du temps, car je n'ai consacré que 5 minutes à cette tâche alors que je n'en avais jamais entendu parler.

Mise à jour :

A partir du lien, j'ai personnalisé un ExpandedGridView :

public class ExpandedGridView extends GridView {
    boolean expanded = false;

    public ExpandedGridView(Context context) {
        super(context);
    }

    public ExpandedGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ExpandedGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded() {
        return 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.
            // But do not use the highest 2 bits of this integer; those are
            // reserved for the MeasureSpec mode.
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded) {
        this.expanded = expanded;
    }
}

Pour votre xml, changez le GridView pour l'ExpandedGridView qui a été personnalisé.

<com.your.package.ExpandedGridView
    android:id="@+id/home_screen_list_goals"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:numColumns="2" />

Utilisation :

Appelez-la dans votre activité. Si vous êtes dans un fragment, utilisez contentView.findViewById(...) . Quel ContentView est défini pour l'ensemble de votre mise en page.

ExpandedGridView gridView = (ExpandedGridView) findViewById(R.id.home_screen_list_goals);
//set data into grid view
gridView.setAdapter(YOUR_ADAPTER_OBJECT);
gridView.setExpanded(true);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X