ale muszę być w stanie dynamicznie dodawać wiersze, jak zwiększyć liczbę miejsc.
To nie jest trudne, gdy masz nowy obiekt dołączyć TableRow
z danymi do TableLayout
.
rozumiem trochę, jak to zrobić dla stałej liczby zakodowanego na stałe przedmiotów na XML, ale to, co będzie najlepszym sposobem, gdy liczba obiektów pochodzi z Activity.java plik?
Nie sądzę, że istnieje najlepszy sposób (lub co uważasz za najlepszy sposób). Możesz:
- Umieścić fałszywe widoki, aby działały jako przekładki. Byłoby to łatwiejsze do wdrożenia wizualnie, ale zwiększy również zużycie pamięci w aplikacji, ze złymi konsekwencjami, jeśli liczba wierszy jest duża. (1)
- lub użyj kanału alfa dla środowisk, aby symulować granic (obrazki jak dziewięć-płatkowe). To byłoby prostsze niż wstawianie dodatkowych widoków, ale potrzebujesz trochę więcej talentu, aby wyglądało dobrze.(2)
Niektóre przykłady obrazu:
(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) lub z obrazami:
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);
}
}
Gdzie obrazy to:
Zignoruj moje umiejętności projektowe.
Jeśli przewidujesz dużą liczbę rzędów, radzę użyć modelu ListView
, który może sprawić, że będzie wyglądać jak stół z obramowaniem.
To jest dokładnie to, co zdecydowałem. Stworzyłem szuflady xml do użycia. – yams
Przy okazji, dziękuję. – yams