2009-04-21 8 views
14

J'ai une application qui aura 5-15 boutons en fonction de ce qui est disponible à partir d'un backend. Comment puis-je définir les bons fichiers de mise en page GridView 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, de sorte que le code onClick sera le même à l'exception de l'article qu'il ajoute au panier.Ajouter un tableau de boutons à un GridView dans une application Android

Comment puis-je définir un tableau afin de pouvoir ajouter un nombre variable de boutons, tout en référençant chacun d'entre eux par un identifiant unique? J'ai vu des exemples de arrays.xml, mais ils ont créé un tableau de chaînes qui sont préréglées. J'ai besoin d'un moyen de créer un objet et ne pas avoir le texte défini dans la mise en page ou les tableaux fichier XML. .

Mise à jour - Ajout d'info sur l'ajout à un GridView

Je veux ajouter à un GridView, afin d'appeler la [méthode addView] (http://developer.android.com/reference/android/widget/AdapterView.html#addView(android.view.View,%20int) résultats dans un UnsupportedOperationException je peux faire ce qui suit:

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 pas les boutons Mise en page dans une grille comme je voudrais peut-il être fait dans un GridView

Répondre

8

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

Si vous décidez de réutiliser le paramètre convertView, vous devez réinitialiser tous les à l'intérieur. C'est une ancienne vue qui vous est transmise par le framework, afin de sauver le coût de gonfler la mise en page. Il n'est presque jamais associé à la position il était dans la mise en page avant.

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 une de ces choses Android où le concept est un peu difficile à saisir au premier abord, jusqu'à ce que vous vous rendez compte qu'il ya une optimisation importante disponible en son sein (dois être gentil avec CPU sur un petit appareil mobile

23

Dans le code suivant, vous devez modifier les limites supérieures du pour, 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 
Questions connexes