Добавление динамических таблиц в Android

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

   

Файл активности, в котором строки добавляются динамически,

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

Вы не должны использовать элемент, определенный в 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); } } -  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); } } 

Создайте функцию 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); } } 

Вызов функции init в методе onCreate:

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

Файл макета:

          

Будет выглядеть так:

введите описание изображения здесь

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

изменить код 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); } - 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     

Твой 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); } } 
  • Android: программно добавление кнопок в макет
  • Плагин Android заменяет вид другим видом во время выполнения
  • Что означает эллипсис в андроиде?
  • Получить высоту и ширину компоновки программно
  • Изменить правильную маржу в представлении Programmatically?
  • Как реализовать андроид: фон, который не растягивается?
  • Макет дизайна для нескольких экранов
  • Обновите обновление ProgressBar
  • Android Studio - TextView не отображается в макете дизайна
  • Как ссылаться на атрибут цвета в drawable?
  • ViewPager setCurrentItem (pageId, true) НЕ плавает
  • Interesting Posts

    Как копирование файлов работает в отношении ОЗУ, и могу ли я ускорить это?

    Не удается найти Theme.AppCompat.Light для новой поддержки Android ActionBar

    Как упаковать приложение командной строки в apk?

    Ошибка при установке виртуального бокса

    Ubuntu Linux: найти файлы между конкретным временем?

    Местоположение Google Chrome

    Настройка VPN для прохождения определенных IP-адресов, а не других

    Импортировать библиотеки в Eclipse?

    Как вы гарантируете, что Cascade Delete включена в отношении отношения таблицы в EF Code?

    QR-коды для файлов в Google Code

    Текст был усечен или один или несколько символов не совпадали на целевой кодовой странице. При импорте из файла Excel

    NetworkStream.ReadAsync с маркером отмены никогда не отменяет

    Как сделать тип привязки данных безопасным и поддерживать рефакторинг

    «C» sizeof с типом или переменной

    Как подключиться к точке доступа по BSSID вместо ESSID в Windows 7?

    Давайте будем гением компьютера.