Android - динамически добавлять строки в таблицу с данными из текстовой записи - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь получить данные из текстовой записи, добавить данные в макет таблицы и обновить макет. Когда я нажимаю кнопку «Добавить», появляется диалоговое окно с текстовым полем. После того, как я что-то введу и нажму «ОК», он должен создать новую строку и обновить представление.

<TableLayout android:id="@+id/table"
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:background="#f7ad5d"
             android:weightSum="1">

    <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tableRow1">
        <Button android:layout_width="100px" android:text="Add" android:textSize="13px" android:layout_height="50px" android:id="@+id/add_button"></Button>
    </TableRow>
    <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tableRow2">
        <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" android:text="  My List"></TextView>
    </TableRow>

</TableLayout>

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button addBtn = (Button) findViewById(R.id.add_button);
    addBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog();
        }
    });
}

    private void update() {
    TableLayout table = (TableLayout)findViewById(R.id.table);
    TableRow tr = new TableRow(this);
    tr.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

    TextView tv = new TextView(this);
    tv.setText("New Entry");
    tr.addView(tv);

    table.addView(tr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}


    /**
 * Show a dialog
 */
private void showDialog() {
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);
    final EditText input = new EditText(this);
    alert.setView(input);
    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            String value = input.getText().toString().trim();
            Toast.makeText(getApplicationContext(), value, Toast.LENGTH_SHORT).show();
            finish();
            startActivity(getIntent());
            update();
        }
    });

    alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    alert.show();
}

Пока я не собираю данные из текстовой записи. Я просто пытаюсь добавить фиктивные данные в макет таблицы с фиктивными данными, но я продолжаю получать сообщение «У указанного дочернего элемента уже есть родительский элемент. Сначала необходимо вызвать removeView () для родительского дочернего элемента». на этой линии

table.addView (tr, новый TableLayout.LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

Я новичок в разработке Android. Было бы здорово, если бы кто-нибудь дал мне несколько советов по этому поводу.

Спасибо.

Ответы [ 3 ]

1 голос
/ 10 июня 2013

Попробуйте этот код для вашего метода обновления:

private void update() {
    TableLayout table = (TableLayout)findViewById(R.id.table);

    TableRow tr = new TableRow(this);
    tr.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));

    TextView tv = new TextView(this);
    tv.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
    tv.setText("New Entry");
    tr.addView(tv);

    table.addView(tr);
}

Важными вещами являются:

  • Когда вы добавляете TableRow к TableLayout, используйте TableLayout.LayoutParams
  • Когда вы добавляете View к TableRow, используйте TableRow.LayoutParams
0 голосов
/ 09 декабря 2011

Полагаю, tr - это переменная, которую вы используете повторно. Вам нужно создать новый TableRow для каждой строки, которую вы хотите добавить.

Если вы хотите сделать определение таблицы и строки в XML, вы можете использовать следующий подход.

Сначала создайте 2 файла макета, один для вашей таблицы и один для строки таблицы, например:

table_header.xml

<TableRow xmlns:android="http://schemas.android.com/apk/res/android" style="@style/TableHeader">
    <TextView style="@style/TableRowHeaderCell" android:text="@string/index" />
    <TextView style="@style/TableRowHeaderCell" android:text="@string/count" />
</TableRow>

table_row.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" style="@style/TableRow">
    <TextView style="@style/NumberInTable" android:id="@+id/textViewIndex" />
    <TextView style="@style/NumberInTable" android:id="@+id/textViewCount" />
</TableRow>

Дополнительным преимуществом является то, что стили могут применяться к вашей таблице и строкам.

Здесь, чтобы добавить строку в таблицу, вам нужно инициализировать таблицу следующим кодом:

_tableLayoutResults = (TableLayout) findViewById(R.id.tableLayoutResults);
final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.table_header, _tableLayoutResults);

Чтобы добавить новую строку, вы должны использовать что-то вроде:

// create the row with the xml layout
final View row = inflater.inflate(R.layout.table_row, null);

// set values in row
((TextView)row.findViewById(R.id.textViewIndex)).setText("someText");

// finally add the row
_tableLayoutResults.addView(row);
0 голосов
/ 09 декабря 2011

Вы можете посмотреть на это

Надеюсь, это поможет,

Приветствия

...