在Android中dynamic添加表格行

我想创build一个布局,我需要dynamic添加表格行。 下面是表格布局xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/displayLinear" android:background="@color/background_df" android:orientation="vertical" > <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/display_row" android:layout_marginTop="280dip" > </TableLayout> 

行正被dynamic添加的活动文件是

 public void init(){ menuDB = new MenuDBAdapter(this); ll = (TableLayout) findViewById(R.id.displayLinear); TableRow row=(TableRow)findViewById(R.id.display_row); for (int i = 0; i <2; i++) { checkBox = new CheckBox(this); tv = new TextView(this); addBtn = new ImageButton(this); addBtn.setImageResource(R.drawable.add); minusBtn = new ImageButton(this); minusBtn.setImageResource(R.drawable.minus); qty = new TextView(this); checkBox.setText("hello"); qty.setText("10"); row.addView(checkBox); row.addView(minusBtn); row.addView(qty); row.addView(addBtn); ll.addView(row,i); } } 

但是当我运行这个,我得到以下错误

 08-13 16:27:46.437: E/AndroidRuntime(23568): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roms/com.example.roms.DisplayActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

我明白,这是由于命令ll.addView(row,i); 但是当我删除这个它添加在一行中的所有东西,而不是创build一个新的行下一个项目。 我尝试索引也row.addView(addBtn,i)但仍然没有正确填充。 请指教。 谢谢。

您不应该使用布局XML中定义的项目来创build更多的实例。 您应该在单独的XML中创build它并将其充气或创buildTableRow programmaticaly。 如果创build它们programmaticaly,应该是这样的:

  public void init(){ TableLayout ll = (TableLayout) findViewById(R.id.displayLinear); for (int i = 0; i <2; i++) { TableRow row= new TableRow(this); TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT); row.setLayoutParams(lp); checkBox = new CheckBox(this); tv = new TextView(this); addBtn = new ImageButton(this); addBtn.setImageResource(R.drawable.add); minusBtn = new ImageButton(this); minusBtn.setImageResource(R.drawable.minus); qty = new TextView(this); checkBox.setText("hello"); qty.setText("10"); row.addView(checkBox); row.addView(minusBtn); row.addView(qty); row.addView(addBtn); ll.addView(row,i); } } 

创build一个init()函数并指向表格布局。 然后创build所需的行和列。

  public void init() { TableLayout stk = (TableLayout) findViewById(R.id.table_main); TableRow tbrow0 = new TableRow(this); TextView tv0 = new TextView(this); tv0.setText(" Sl.No "); tv0.setTextColor(Color.WHITE); tbrow0.addView(tv0); TextView tv1 = new TextView(this); tv1.setText(" Product "); tv1.setTextColor(Color.WHITE); tbrow0.addView(tv1); TextView tv2 = new TextView(this); tv2.setText(" Unit Price "); tv2.setTextColor(Color.WHITE); tbrow0.addView(tv2); TextView tv3 = new TextView(this); tv3.setText(" Stock Remaining "); tv3.setTextColor(Color.WHITE); tbrow0.addView(tv3); stk.addView(tbrow0); for (int i = 0; i < 25; i++) { TableRow tbrow = new TableRow(this); TextView t1v = new TextView(this); t1v.setText("" + i); t1v.setTextColor(Color.WHITE); t1v.setGravity(Gravity.CENTER); tbrow.addView(t1v); TextView t2v = new TextView(this); t2v.setText("Product " + i); t2v.setTextColor(Color.WHITE); t2v.setGravity(Gravity.CENTER); tbrow.addView(t2v); TextView t3v = new TextView(this); t3v.setText("Rs." + i); t3v.setTextColor(Color.WHITE); t3v.setGravity(Gravity.CENTER); tbrow.addView(t3v); TextView t4v = new TextView(this); t4v.setText("" + i * 15 / 32 * 10); t4v.setTextColor(Color.WHITE); t4v.setGravity(Gravity.CENTER); tbrow.addView(t4v); stk.addView(tbrow); } } 

在onCreate方法中调用init函数:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); init(); } 

布局文件如:

  <ScrollView android:id="@+id/scrollView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#3d455b" android:layout_alignParentLeft="true" > <HorizontalScrollView android:id="@+id/hscrll1" android:layout_width="fill_parent" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/RelativeLayout1" android:layout_width="fill_parent" android:layout_gravity="center" android:layout_height="fill_parent" android:orientation="vertical" > <TableLayout android:id="@+id/table_main" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" > </TableLayout> </RelativeLayout> </HorizontalScrollView> </ScrollView> 

会看起来像:

在这里输入图像描述

正如Fredigato所说,您也可以在一个单独的布局文件中声明一个RelativeLayout 。 然后使用下面的方法实例化它:

 for(int i = 0; i < 6; i ++){ LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService (Context.LAYOUT_INFLATER_SERVICE); RelativeLayout row = (RelativeLayout) inflater.inflate(R.layout.table_view,null); quizesTableLayout.addView(row,i); } 

在这种方法中,您可以使用XML轻松devise一个自定义行并重新使用它。

现在,可以在实例化的RelativeLayout中更改子视图。 你可以调用row.childAt(index)

所以可以说,你在RelativeLayout中有一个TextView,你可以使用:

 TextView tv = (TextView) row.childAt(0); tv.setText("Text"); 

改变init的代码如下,

 public void init(){ menuDB = new MenuDBAdapter(this); ll = (TableLayout) findViewById(R.id.displayLinear); ll.removeAllViews() for (int i = 0; i <2; i++) { TableRow row=(TableRow)findViewById(R.id.display_row); checkBox = new CheckBox(this); tv = new TextView(this); addBtn = new ImageButton(this); addBtn.setImageResource(R.drawable.add); minusBtn = new ImageButton(this); minusBtn.setImageResource(R.drawable.minus); qty = new TextView(this); checkBox.setText("hello"); qty.setText("10"); row.addView(checkBox); row.addView(minusBtn); row.addView(qty); row.addView(addBtn); ll.addView(row,i); } 
 Activity <HorizontalScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TableLayout android:id="@+id/mytable" android:layout_width="match_parent" android:layout_height="match_parent"> </TableLayout> </HorizontalScrollView> 

你的class

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_testtable); table = (TableLayout)findViewById(R.id.mytable); showTableLayout(); } public void showTableLayout(){ Date date = new Date(); int rows = 80; int colums = 10; table.setStretchAllColumns(true); table.bringToFront(); for(int i = 0; i < rows; i++){ TableRow tr = new TableRow(this); for(int j = 0; j < colums; j++) { TextView txtGeneric = new TextView(this); txtGeneric.setTextSize(18); txtGeneric.setText( dateFormat.format(date) + "\t\t\t\t" ); tr.addView(txtGeneric); /*txtGeneric.setHeight(30); txtGeneric.setWidth(50); txtGeneric.setTextColor(Color.BLUE);*/ } table.addView(tr); } }