16

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

如何定义一个数组,以便我可以添加可变数量的按钮,但仍然通过唯一 ID 引用它们中的每一个?我已经看到了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 中完成吗?

4

3 回答 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
于 2010-05-22T21:31:13.533 回答
14

这是一个很好的示例:

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

您应该只在 getView 适配器方法中创建按钮而不是图像视图。

于 2009-05-05T09:10:02.597 回答
9

如果您使用的是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 很好)

于 2010-04-24T01:10:05.770 回答