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

16
我有一个应用程序,根据后端提供的内容,将会有5-15个按钮。我该如何定义正确的GridView布局文件,以包含一组具有不同文本和其他属性的按钮?每个按钮实质上都会向购物车添加一个项目,因此onClick代码除了添加到购物车的项目之外,其余都相同。
我该如何定义一个数组,以便我可以添加可变数量的按钮,但仍然通过唯一ID引用每个按钮?我看过arrays.xml的示例,但它们创建了一个预设的字符串数组。我需要一种创建对象并且不在布局或数组xml文件中定义文本的方法。
更新-添加有关添加到GridView的信息
我想将其添加到GridView中,因此调用[addView method](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个回答

23
在下面的代码中,你应该将 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

9

如果你使用的是 GridViewListView(等等),并且通过适配器 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 进行优化)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接