2013-08-13 2 views
18

Я пытаюсь создать макет, где мне нужно динамически добавлять строки таблицы. Ниже приведен макет таблицы XMLДобавление строк в таблице Динамически в Android

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

Активность файл, где строки добавляются динамически в

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);, но когда я удаляю ее, она добавляет все вещи в одну строку, а не создает новую строку для следующего элемента. Я пробовал с указателем также как row.addView(addBtn,i), но все же его не заселяли правильно. Пожалуйста, порекомендуйте. Благодарю.

+0

Здесь таблица строк уже в XML-файле ... Так что перед вы добавляете программно, вы должны вызвать метод ll.removeallViews(). – Piyush

ответ

40

Вы не должны использовать элемент, определенный в Layout XML для того, чтобы создать несколько экземпляров этого. Вы должны либо создать его в отдельном XML, либо раздуть его, либо создать программную таблицу TableRow. Если вы создаете их программно, должно быть примерно так:

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); 
    } 
} 
+1

Большое спасибо. Это сработало. – user2416087

+1

Обратите внимание, что вы должны установить правильные LayoutParams, чтобы они соответствовали описанию в вашем XML, в этом примере вам не удалось провести какое-либо исследование :) – Fredigato

+0

Не работает для меня - ничего не отображается. – user3690202

3

код изменение инициализации, как следующий,

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

    } 
+0

Спасибо. Я попробовал, как было предложено, но теперь получаю исключение нулевой точки 08-13 16:56:14.727: E/AndroidRuntime (25623): java.lang.RuntimeException: Невозможно запустить Activity ComponentInfo {com.example.roms/com.example.roms.DisplayActivity}: java.lang.NullPointerException – user2416087

+0

у вас инициализируют все ваши взгляды изначально – mdDroid

48

Создайте функцию init() и укажите расположение таблицы. Затем создайте нужные строки и столбцы.

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 метод:

@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> 

будет выглядеть следующим образом:

enter image description here

+5

Вы, сэр, спасатель. Спасибо ! –

+0

Спасибо, сэр, вы сохранили мой dy) – elik

7

Вы также гр a, как сказал Фредигато, объявите 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 и использовать его.

Теперь, чтобы иметь возможность изменять представления детей в созданном экземпляре RelativeLayout. Вы можете позвонить row.childAt (index).

Так позволяет сказать, что у вас есть TextView в RelativeLayout, вы можете использовать:

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

Это должно быть выбранное решение. также вы можете использовать row.findViewById() вместо childAt(). – SolidSnake

1
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> 

Ваш класс

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); 
    } 
} 
Смежные вопросы