web-dev-qa-db-fra.com

Ajouter un tableau de boutons à une GridView dans une application Android

J'ai une application qui aura 5 à 15 boutons en fonction de ce qui est disponible depuis un backend. Comment définir les fichiers de présentation GridView appropriés pour inclure un tableau de boutons qui auront chacun un texte différent et d'autres attributs? Chaque bouton ajoutera essentiellement un article à un panier, donc le code onClick sera le même, sauf pour l'article qu'il ajoute au panier.

Comment puis-je définir un tableau afin que je puisse ajouter un nombre variable de boutons, mais toujours référencer chacun d'eux par un ID unique? J'ai vu des exemples de arrays.xml , mais ils ont créé un tableau de chaînes prédéfinies. J'ai besoin d'un moyen de créer un objet et de ne pas avoir le texte défini dans le fichier xml de mise en page ou de tableaux.

Mise à jour - Ajout d'informations sur l'ajout à une GridView

Je veux ajouter ceci à une GridView, donc appeler la [méthode addView] ( http://developer.Android.com/reference/Android/widget/AdapterView.html#addView (Android.view.View,% 20int) entraîne une exception UnsupportedOperationException. Je peux effectuer les opérations suivantes:

ImageButton b2 = new ImageButton(getApplicationContext());
b2.setBackgroundResource(R.drawable.img_3);
Android.widget.LinearLayout container = (Android.widget.LinearLayout) findViewById(R.id.lay);
container.addView(b2);

mais cela ne présente pas les boutons dans une grille comme je le voudrais. Cela peut-il être fait dans une GridView?

16
Tai Squared

Dans le code suivant, vous devez modifier les limites supérieures de for en une variable.

public class MainActivity
        extends Activity
        implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TableLayout layout = new TableLayout (this);
        layout.setLayoutParams( new TableLayout.LayoutParams(4,5) );

        layout.setPadding(1,1,1,1);

        for (int f=0; f<=13; f++) {
            TableRow tr = new TableRow(this);
            for (int c=0; c<=9; c++) {
                Button b = new Button (this);
                b.setText(""+f+c);
                b.setTextSize(10.0f);
                b.setTextColor(Color.rgb( 100, 200, 200));
                b.setOnClickListener(this);
                tr.addView(b, 30,30);
            } // for
            layout.addView(tr);
        } // for

        super.setContentView(layout);
    } // ()

    public void onClick(View view) {
        ((Button) view).setText("*");
        ((Button) view).setEnabled(false);
    }
} // class
23
cibercitizen1

Voici un bel échantillon pour vous:

https://developer.Android.com/guide/topics/ui/layout/gridview.html

Vous devez simplement créer des boutons au lieu d'images vues dans la méthode de l'adaptateur getView.

14
Fedor

Si vous utilisez un GridView, ou un ListView (etc), et que vous produisez des vues pour les remplir via l'adaptateur getView (pos, convertView, viewGroup), vous pourriez rencontrer de la confusion (je l'ai fait une fois).

Si vous décidez de réutiliser le paramètre convertView, vous devez réinitialiser tout à l'intérieur. C'est une ancienne vue qui vous est transmise par le cadre, afin d'économiser le coût de gonfler la mise en page. Il n'est presque jamais associé à la position dans laquelle il se trouvait auparavant.

class GridAdapter extends BaseAdapter // assigned to your GridView
{
    public View getView(int position, View convertView, ViewGroup arg2) {
        View view;
        if (convertView==null)
        {
            view = getLayoutInflater().inflate(R.layout.Gd_grid_cell, null);
        }
        else
        {
             // reusing this view saves inflate cost
             // but you really have to restore everything within it to the state you want
            view = convertView;
        }


        return view;
    }
    //  other methods omitted (e.g. getCount, etc) 
}

Je pense que cela représente l'une de ces choses Android où le concept est un peu difficile à saisir au début, jusqu'à ce que vous vous rendiez compte qu'il y a une optimisation significative disponible en lui (doit être agréable pour le processeur sur un peu appareil mobile)

9
alienjazzcat

Dans le code suivant, vous devez modifier les limites supérieures du for en une variable.

public class MainActivity
        extends Activity
        implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TableLayout layout = new TableLayout (this);
        layout.setLayoutParams( new TableLayout.LayoutParams(4,5) );

        layout.setPadding(1,1,1,1);

        for (int f=0; f<=13; f++) {
            TableRow tr = new TableRow(this);
            for (int c=0; c<=9; c++) {
                Button b = new Button (this);
                b.setText(""+f+c);
                b.setTextSize(10.0f);
                b.setTextColor(Color.rgb( 100, 200, 200));
                b.setOnClickListener(this);
                tr.addView(b, 30,30);
            } // for
            layout.addView(tr);
        } // for

        super.setContentView(layout);
    } // ()

    public void onClick(View view) {
        ((Button) view).setText("*");
        ((Button) view).setEnabled(false);
    }
} 
1
james james