Autore Topic: Consiglio su TableLayout con celle numerose.  (Letto 449 volte)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Consiglio su TableLayout con celle numerose.
« il: 21 Agosto 2011, 16:15:26 CEST »
0
Ciao,
  questo post potrebbe essere lungo e complicato, quindi ringrazio in anticipo chi mi voglia dare un consiglio.   :-P

Mettiamo il caso debba inserire dei valori in una tabella del genere:

GiornoMeleBananeTotale
Lunedì235
Martedì437
Mercoledì112
Giovedì516
Venerdì1910

Per comodità di allineamento e calcolo dei valori (la tabella vera è molto più complicata), preferisco utilizzare un tableLayout piuttosto che una listView.
Ho cercato in lungo e in largo qualche idee preconfezionata per fare il tutto in maniera ordinata, usando il minimo codice possibile e facilitando eventuali aggiunte future. Purtroppo, però, non ho trovato assolutamente nulla che mi andasse a genio e ho dovuto spremere le meningi.  ;-)

Ho pensato di:
- Riutilizzare lo stesso layout per ogni riga della tabella
- Usare una customView per ogni riga e modificarla in modo da poter accedere alle textView "velocemente", senza scrivere mille "findViewById()".

Il risultato:

#1 Layout della tabella: ogni riga è un include del file table_row, che contiene il layout comune a tutte le righe.
Codice (XML): [Seleziona]
                                 <TableLayout
                                        android:layout_width="fill_parent"
                                        android:layout_height="wrap_content"
                                        android:stretchColumns="*"
                                        android:shrinkColumns="*">
                                        <include
                                                layout="@layout/table_row"
                                                android:id="@+id/row_labels" />
                                        <include
                                                layout="@layout/table_row"
                                                android:id="@+id/row_lun" />
                                        <include
                                                layout="@layout/table_row"
                                                android:id="@+id/row_mar" />
                                        <include
                                                layout="@layout/table_row"
                                                android:id="@+id/row_mer" />
                                        <include
                                                layout="@layout/table_row"
                                                android:id="@+id/row_gio" />
                                        <include
                                                layout="@layout/table_row"
                                                android:id="@+id/row_ven" />
                                </TableLayout>

#2 Layout della riga: è una tableRow customizzata (vd. punto #3).
Codice (XML): [Seleziona]
<view
        xmlns:android="http://schemas.android.com/apk/res/android"
        class="com.test.FruttaActivity$TableRow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView
                android:id="@+id/tableRow_day" />
        <TextView
                android:id="@+id/tableRow_mele" />
        <TextView
                android:id="@+id/tableRow_banane" />
        <TextView
                android:id="@+id/tableRow_totale" />
</view>

#3 View customizzata: l'ho messa all'interno dell'activity, per comodità di organizzazione del codice.
Codice (Java): [Seleziona]
public static class ValuesRow extends TableRow {
                TextView day, mele, banane, totale;

                public ValuesRow(Context context, AttributeSet attrs) {
                        super(context, attrs);
                }

                public ValuesRow(Context context) {
                        super(context);
                }

                @Override
                protected void onFinishInflate() {
                        super.onFinishInflate();
                        //Unica aggiunta: una volta terminato l'inflate, istanzia le textView.
                        setup();
                }

                private void setup() {
                        day = (TextView) findViewById(R.id.tableRow_day);
                        mele = (TextView) findViewById(R.id.tableRow_mele);
                        banane = (TextView) findViewById(R.id.tableRow_banane);
                        totale = (TextView) findViewById(R.id.tableRow_totale);
                }

        }

#4 Logica per settare il testo nelle textView:
Codice (Java): [Seleziona]
public class FruttaActivity extends Activity {

        // Riga della tabella
        private TableRow tableRow;

        // Array che contiene tutti gli id delle stringhe del nome dei giorni
        int[] dayLabels = new int[] { R.string.lun,
                        R.string.mar, R.string.mer,R.string.gio, R.string.ven };

        // Array che contiene gli id delle righe della tabella
        int[] rowIds = new int[] { R.id.row_lun,
                        R.id.row_mar, R.id.row_mer, R.id.row_gio, R.id.row_ven, };
       
        // Mappa chiave-valore in cui la chiave Integer è l'id della riga (per esempio R.id.row_lun) e il valore è un array con mele, banane e totale di quel giorno ( int[]  {n° mele, n° banane, n° totale} );
        Map<Integer, int[]> valuesMap = new HashMap<Integer, int[]>();


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

                for (int i = 0; i < rowIds.lenght; i++){
                     // Trova la riga del giorno i e poi setta i vari valori. Dalla variabile valuesMap, prende l'array associato a quel giorno.
                     // La customView TableRow mi permette di accedere velocemente alle textView di ogni riga della tabella.
                     tableRow = (TableRow) findViewById(rowIds[i);
   
                     tableRow.day.setText(dayLabels[i]);
                     tableRow.mele.setText(""+valuesMap.get(rowIds[i])[0];
                     tableRow.banane.setText(""+valuesMap.get(rowIds[i])[1];
                     tableRow.totale.setText(""+valuesMap.get(rowIds[i])[2];
                }
        }
         (...)
         // Custom View (vd. punto #3)
}


Tutto funziona a dovere, ma vorrei l'opinione di qualcuno sull'efficienza di questa implementazione, possibili problemi, eventuali cambiamenti o altre possibili tecniche per ottenere lo stesso risultato.
« Ultima modifica: 21 Agosto 2011, 16:26:45 CEST da Verandi »