在Android应用程序中向GridView添加按钮数组

在Android应用程序中向GridView添加按钮数组,android,arrays,button,dynamic,android-gridview,Android,Arrays,Button,Dynamic,Android Gridview,我有一个应用程序,将有5-15个按钮,这取决于什么是从后端可用。如何定义适当的GridView布局文件以包含一组按钮,每个按钮都具有不同的文本和其他属性?每个按钮基本上都会将一个项目添加到购物车中,因此onClick代码除了添加到购物车中的项目之外都是相同的 如何定义一个数组,以便添加数量可变的按钮,但仍然通过唯一的ID引用每个按钮?我见过的例子,但他们已经创建了一个预设字符串数组。我需要一种方法来创建一个对象,而不是在布局或数组xml文件中定义文本 更新-添加有关添加到GridView的信息

我有一个应用程序,将有5-15个按钮,这取决于什么是从后端可用。如何定义适当的GridView布局文件以包含一组按钮,每个按钮都具有不同的文本和其他属性?每个按钮基本上都会将一个项目添加到购物车中,因此onClick代码除了添加到购物车中的项目之外都是相同的

如何定义一个数组,以便添加数量可变的按钮,但仍然通过唯一的ID引用每个按钮?我见过的例子,但他们已经创建了一个预设字符串数组。我需要一种方法来创建一个对象,而不是在布局或数组xml文件中定义文本

更新-添加有关添加到GridView的信息

我想将其添加到GridView,因此调用[addView方法](会导致不支持的操作异常。我可以执行以下操作:

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

但这并不像我希望的那样在网格中布局按钮。这可以在网格视图中完成吗?

这是一个很好的示例:


您应该在getView adapter方法中创建按钮而不是ImageView。

如果您使用的是GridViewListView(etc),并通过适配器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的一个特点,一开始这个概念有点难理解,直到你意识到它有一个显著的优化(必须对小型移动设备上的CPU很好)

在下面的代码中,你应该将
上限改为一个变量

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
公共类活动
扩展活动
实现View.OnClickListener{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
TableLayout layout=新的TableLayout(本);
layout.setLayoutParams(新的TableLayout.LayoutParams(4,5));
布局。设置填充(1,1,1,1);
对于(int f=0;f