Добавить массив кнопок в GridView в приложении для Android - PullRequest
16 голосов
/ 22 апреля 2009

У меня есть приложение, которое будет иметь 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?

Ответы [ 3 ]

24 голосов
/ 23 мая 2010

В следующем коде вы должны изменить верхние пределы 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
14 голосов
/ 05 мая 2009

Вот хороший образец для вас:

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

Вы должны просто создать кнопки вместо изображений в методе getView.

9 голосов
/ 24 апреля 2010

Если вы используете GridView или ListView (и т. Д.) и создаете представления для их заполнения через адаптер getView (pos, convertView, viewGroup) , вы можете столкнуться с путаницей (я однажды это сделал).

Если вы решили повторно использовать параметр convertView, вы должны сбросить все внутри него. Это старый вид, передаваемый вам фреймворком, чтобы сэкономить на раздувании макета. Он почти никогда не ассоциируется с положением , которое было в макете ранее.

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, где поначалу немного сложно понять концепцию, пока вы не поймете, что в ней есть существенная оптимизация (должна быть хороша для процессора на небольшом мобильном устройстве)

...