Agregue una matriz de botones a un GridView en una aplicación de Android

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.

¿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: se agregó información sobre cómo agregar a un GridView

Quiero agregar esto a un GridView, por lo que llamar al [método addView] ( http://developer.android.com/reference/android/widget/AdapterView.html#addView(android.view.View,%20int) da como resultado una UnsupportedOperationException. Puedo 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 distribuye los botones en una cuadrícula como me gustaría. ¿Se puede hacer esto en un GridView?

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

Aquí hay una buena muestra para ti:

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

Solo debe crear botones en lugar de imágenes en el método del adaptador getView.

Si está utilizando un GridView , un ListView (etc) y está produciendo vistas para rellenarlos a través del adaptador getView (pos, convertView, viewGroup) , puede encontrar 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 en la que estaba antes.

 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 restre everything within it to the state you want view = convertView; } return view; } // other methods omitted (eg 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 te das cuenta de que hay una optimización significativa disponible dentro de él (tiene que ser agradable a la CPU en un pequeño dispositivo móvil)