0

Мне нужно создать более одного TableLayout с различным количеством строк в одном XML-макете.Создание более одного TableLayout в том же макете

В моем основном макете у меня пустой LinearLayout, как показано ниже:

<LinearLayout android:id="@+id/resultsLayout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

</LinearLayout> 

Я заявляю это в моей деятельности в качестве так:

private LinearLayout linearResultsLayout; 
linearResultsLayout = (LinearLayout) findViewById(R.id.resultsLayout); 

Я добавил table_layout.xml и А table_row.xml в моей папке Layouts:

Table_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/resultsTable" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:weightSum="99" 
    android:background="@drawable/curvedbg" 
    > 


</TableLayout> 

Table_row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView android:id="@+id/row_header" android:layout_weight="33" /> 
    <TextView android:id="@+id/downstream" android:layout_weight="33"/> 
    <TextView android:id="@+id/upstream" android:layout_weight="33"/> 

</TableRow> 

Моя цель состоит в том, чтобы раздуть таблицу, а затем надуть, как никогда много строк я требую, чтобы вновь надувается таблицы в то же время передачи данных в виде TextViews. Код ниже должен дать вам представление о том, что я пытаюсь сделать. Однако это не работает. Исключение нулевого указателя.

private void createTable() { 

     String[] downResults = {"Downstream","2000","98"}; 
     String[] upResults = {"Upstream","1000","78"}; 
     String[] rowHeadings = {"","Bandwidth","QoS"}; 

     TextView heading = (TextView) findViewById(R.id.row_header); 
     TextView downstream = (TextView) findViewById(R.id.downstream); 
     TextView upstream = (TextView) findViewById(R.id.upstream); 
     TableLayout newTable = (TableLayout) findViewById(R.id.resultsTable); 

     View table = inflater.inflate(R.layout.table_layout, null); 
     View row = inflater.inflate(R.layout.table_row, null); 
     linearResultsLayout.addView(table); 

     for(int i = 0; i < rowHeadings.length; i++){ 
      heading.setText(rowHeadings[i].toString()); 
      downstream.setText(downResults[i].toString()); 
      upstream.setText(upResults[i].toString()); 
      newTable.addView(row); 
     } 

    } 

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

ответ

0

Вы, вероятно, следует использовать ListView:

Но, если вы не можете/не будет, проблема у вас есть то, что вы ссылаетесь неправильную раскладку, когда вы получаете ваши TextView объекты. Ваш код должен выглядеть примерно так:

String[] downResults = {"Downstream","2000","98"}; 
    String[] upResults = {"Upstream","1000","78"}; 
    String[] rowHeadings = {"","Bandwidth","QoS"}; 

    View table = inflater.inflate(R.layout.table_layout, linearResultsLayout, false)); 
    View row = inflater.inflate(R.layout.table_row, linearResultsLayout, false)); 

    TextView heading = (TextView) row.findViewById(R.id.row_header); 
    TextView downstream = (TextView) row.findViewById(R.id.downstream); 
    TextView upstream = (TextView) row.findViewById(R.id.upstream); 
    TableLayout newTable = (TableLayout) table.findViewById(R.id.resultsTable); 

    linearResultsLayout.addView(table); 

    for(int i = 0; i < rowHeadings.length; i++){ 
     heading.setText(rowHeadings[i].toString()); 
     downstream.setText(downResults[i].toString()); 
     upstream.setText(upResults[i].toString()); 
     table.addView(row); 
    } 

Обратите внимание на row.findViewById, а также table.addView

EDIT: обратите внимание на изменения в макете Inflater

+0

Я попытался это и получил ошибку на «столе .addView (строка) ". Метод addView (View) не определен для типа View. Я добавил актер, как это было предложено, но это приводит к нулевому указателю при запуске –

+0

двух вещей - во-первых, вы изменили порядок? сначала нужно раздуть макет. Во-вторых, вам может потребоваться передать родительский вид, но это обычно вызывает другую проблему. – Jim

+0

Привет @ Jim, да, я изменил порядок. Я скопировал и вставил из вашего примера. –

Смежные вопросы