2013-03-15 27 views
7

Tworzę aplikację dla systemu Android. Ta aplikacja na Androida będzie zawierała obiekty dynamiczne. Te obiekty to Miejsca z adresem lub Lat/Long i odległość od aktualnej lokalizacji oraz ETA. Chciałbym dodać obiekty z numerem TableLayout z ramkami, ale muszę mieć możliwość dynamicznego dodawania wierszy w miarę wzrostu liczby miejsc.Dodawanie dynamicznego TableLayout z granicami w Android App

Rozumiem, jak to zrobić w przypadku ustalonej, zakodowanej na stałe liczby pozycji w pliku XML, ale jaki byłby najlepszy sposób, gdy liczba obiektów pochodzi z pliku Activity.java?

Poniżej znajduje się zrzut ekranu TableLayout Chciałbym:

Table Layout

więc obiekt będzie miejscem, z adresem, odległości i kierunku.

Odpowiedz

7

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:

  • R.drawable.cell:

  • R.drawable.extra (wizualnie przezroczysty odkształcalny, który replikuje dziewięciu plastra powyżej)

  • R.drawable.normalrow:

  • R.drawable.firstrow:

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.

+0

To jest dokładnie to, co zdecydowałem. Stworzyłem szuflady xml do użycia. – yams

+1

Przy okazji, dziękuję. – yams

1

nie mógł dowiedzieć się pionową linię, ale coś można budować na

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ScrollView sv = new ScrollView(this); 

    TableLayout ll=new TableLayout(this); 
    HorizontalScrollView hsv = new HorizontalScrollView(this); 

    for(int i=1;i<5;i++) { 
     TableRow tbrow=new TableRow(this); 

     for(int j=1;j<=3;j++) { 
      TextView tv1=new TextView(this); 
      tv1.setText("Element :"+ i + "" + j); 
      tbrow.addView(tv1);     
     } 
     ll.addView(tbrow); 
     View v = new View(this); 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5); 
     v.setLayoutParams(params); 
     v.setBackgroundColor(getResources().getColor(android.R.color.white)); 
     ll.addView(v); 
    } 
    hsv.addView(ll); 
    sv.addView(hsv); 
    setContentView(sv); 
} 
+0

To działa nieco, ale mam listę obiektów, które chcę iterować. – yams