Добавить массив кнопок в GridView в приложении для Android
У меня есть приложение, которое будет иметь 5-15 кнопок в зависимости от того, что доступно из бэкэнд. Как определить правильные файлы макетов GridView для включения массива кнопок, каждый из которых будет иметь разные текстовые и другие атрибуты? Каждая кнопка по существу добавит элемент в корзину, поэтому код onClick будет таким же, за исключением элемента, который он добавляет в корзину.
Как я могу определить массив, чтобы добавить переменное количество кнопок, но все же ссылаюсь на каждый из них с помощью уникального идентификатора? Я видел примеры arrays.xml, но они создали массив строк, которые предварительно заданы. Мне нужен способ создания объекта и не иметь текст, определенный в XML файле макета или массива.
Обновление - добавлена информация о добавлении в GridView
Я хочу добавить это в GridView, поэтому вызов метода addView (http://developer.android.com/reference/android/widget/AdapterView.html#addView(android.view.View,%20int) приводит к исключению UnsupportedOperationException. следующее:
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);
но это не отображает кнопки в сетке, как хотелось бы. Можно ли это сделать в GridView?
Ответы
Ответ 1
В следующем коде вы должны изменить верхние пределы for,
к переменной.
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
Ответ 2
Вот хороший образец для вас:
https://developer.android.com/guide/topics/ui/layout/gridview.html
Вам нужно просто создавать кнопки вместо изображений в методе адаптера getView.
Ответ 3
Если вы используете GridView или ListView (и т.д.) и создаете Views, чтобы заполнить их с помощью адаптера getView (pos, convertView, viewGroup), вы можете столкнуться с путаницей (я сделал один раз).
Если вы решили повторно использовать параметр convertView, вы должны reset все внутри него. Это старый взгляд, передаваемый вам каркасом, чтобы сэкономить затраты на раздувание макета. Он почти никогда не ассоциировался с позицией, которая была в макете раньше.
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)
}
Я думаю, что это представляет собой одну из тех вещей Android, где концепция немного сложно понять сначала, пока вы не поймете там значительную оптимизацию, доступную внутри нее (должны быть хороши для процессора на небольшом мобильном устройстве)