но мне нужно иметь возможность динамически добавлять строки по мере увеличения количества мест.
Это не сложно, когда у вас есть новый объект, добавляющий TableRow
с данными к TableLayout
.
Я немного понимаю, как это сделать для фиксированного жестко запрограммированного количества элементов в xml, но как лучше всего, когда количество объектов поступает из файла Activity.java?
Я не думаю, что есть лучший способ (или то, что вы считаете лучшим). Вы либо:
- Вставьте поддельные представления, чтобы действовать как разделители. Это было бы проще реализовать визуально, но это также увеличит потребление памяти вашим приложением с плохими последствиями, если количество строк велико. (1)
- Или используйте чертежи для фона, чтобы имитировать границы (например, изображения с девятью патчами). Это было бы проще, чем вставлять дополнительные представления, но вам нужно немного больше таланта, чтобы это выглядело хорошо. (2)
Несколько примеров для вашего изображения:
(1)
private static final int DIVIDER_SIZE = 2;
// rowsCount the number of rows to add to the TableLayout
private void buildOldSchool(TableLayout table, int rowsCount) {
View divider;
for (int i = 0; i < rowsCount; i++) {
TableRow row = new TableRow(this);
for (int j = 0; j < 7; j++) {
if (j % 2 == 0) {
divider = new View(this);
divider.setLayoutParams(new TableLayout.LayoutParams(
DIVIDER_SIZE, TableLayout.LayoutParams.MATCH_PARENT));
divider.setBackgroundColor(Color.GREEN);
row.addView(divider, new TableRow.LayoutParams(
DIVIDER_SIZE, TableRow.LayoutParams.MATCH_PARENT));
continue;
}
TextView tv = new TextView(this);
tv.setText("DX"); // dummy data
row.addView(tv, new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.WRAP_CONTENT));
}
divider = new View(this);
divider.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT, DIVIDER_SIZE));
divider.setBackgroundColor(Color.GREEN);
if (i == 0) {
table.addView(divider);
divider = new View(this);
divider.setLayoutParams(new TableLayout.LayoutParams(
TableLayout.LayoutParams.MATCH_PARENT, DIVIDER_SIZE));
divider.setBackgroundColor(Color.GREEN);
}
table.addView(row);
table.addView(divider);
}
}
(2) или с изображениями:
private void buildWithDrawables(TableLayout table, int rowsCount) {
for (int i = 0; i < rowsCount; i++) {
TableRow row = new TableRow(this);
row.setBackgroundResource(i == 0 ? R.drawable.firstrow
: R.drawable.normalrow);
for (int j = 0; j < 3; j++) {
TextView tv = new TextView(this);
tv.setBackgroundResource(j == 2 ? R.drawable.extra
: R.drawable.cell);
tv.setText("DX");
row.addView(tv, new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.WRAP_CONTENT));
}
table.addView(row);
}
}
Где находятся изображения:
Не обращайте внимания на мои дизайнерские способности.
Если вы предвидите большое количество строк, я бы посоветовал вам использовать ListView
, который вы можете довольно легко сделать похожим на таблицу с границами.
person
user
schedule
18.03.2013