2009-04-21 11 views
14

Tengo una aplicación que tendrá 5-15 botones dependiendo de lo que está disponible desde un back-end. ¿Cómo puedo definir los archivos de diseño GridView adecuados para incluir una matriz de botones que tendrán diferentes textos y otros atributos? Cada botón esencialmente agregará un artículo a un carro, por lo que el código onClick será el mismo excepto el artículo que agregue al carro.Agregue una matriz de botones a un GridView en una aplicación de Android

¿Cómo puedo definir una matriz para poder agregar una cantidad variable de botones, pero seguir haciendo referencia a cada uno de ellos con una ID única? He visto ejemplos de arrays.xml, pero han creado una matriz de cadenas preestablecidas. Necesito una forma de crear un objeto y no tener el texto definido en el diseño o en el archivo xml de matrices. .

Actualización - información añadida sobre la adición de un GridView

quiero añadir esto a un GridView, así que llamar al [Método addView] (http://developer.android.com/reference/android/widget/AdapterView.html#addView(android.view.View,%20int) resultados en una UnsupportedOperationException que pueda hacer lo siguiente:

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); 

pero eso no layout los botones en una cuadrícula como quisiera se puede hacer esto en un GridView

Respuesta

8

Si está utilizando un GridView, o una ListView (etc), y está produciendo Vistas a poblar ellos a través del adaptador getView (pos, convertView, ViewGroup), puede encontrarse con la confusión (lo hice una vez).

Si decide volver a utilizar el parámetro convertView, debe restablecer todo dentro de él. Es una vista antigua que le está pasando a usted por el marco, con el fin de ahorrar el costo de inflar el diseño. Casi nunca está asociado con la posición que estaba antes en el diseño.

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) 
} 

Creo que esto representa una de esas cosas de Android donde el concepto es un poco difícil de entender al principio, hasta que se da cuenta de que hay una importante optimización disponibles dentro de ella (tengo que ser amable con la CPU en un pequeño dispositivo móvil)

23

En el siguiente código, debe cambiar los límites superiores de for, a una 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 
Cuestiones relacionadas