Autore Topic: ListView "IBRIDO"  (Letto 615 volte)

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
ListView "IBRIDO"
« il: 02 Giugno 2011, 10:49:12 CEST »
0
Ciao a tutti!
Ho una listview in cui ciascuna riga è definita da un xml, quest'ultimo ha al suo interno due  TextView (tv1 e tv2).
Io ho in mano un Cursor che ho ricavato dal mio database e un array (della stessa lunghezza).
Praticamente voglio inserire in tutte le tv1 gli elementi del cursor e in tutte le tv2 gli elementi dell'aray. E' possibile?

Ciao, grazie!

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:ListView "IBRIDO"
« Risposta #1 il: 02 Giugno 2011, 16:38:43 CEST »
0
Sì, devi usare un adapter personalizzato. Hai un po' di codice?

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:ListView "IBRIDO"
« Risposta #2 il: 02 Giugno 2011, 19:03:53 CEST »
0
Sì, devi usare un adapter personalizzato. Hai un po' di codice?

Allora:
Questa è la mia riga della LV:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        android:weightSum="10">
        <TextView
                android:text="TextView"
                android:id="@+id/tv_rowSplitName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="8">></TextView>
        <TextView
                android:text="TextView"
                android:id="@+id/tv_rowSplitBalance"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="2">></TextView>
</LinearLayout>
praticamente sono due tv affiancate.
Se avevo solo un cursor da inserire facevo così:
Codice (Java): [Seleziona]
cPeopleByEvent = db.fetchPeopleByEvent(id); // PRIMA COLONNA DELLA LV
                startManagingCursor(cPeopleByEvent);

                adapter1colLV = new SimpleCursorAdapter(this, R.layout.row_split,
                                cPeopleByEvent, new String[] { AppDB.peoName },

                                new int[] { R.id.tv_rowSplitName });

                splitLv.setAdapter(adapter1colLV);

e così setto la prima TextView...

Poi però ho anche l'array di double che voglio settare come seconda tv;
Codice (Java): [Seleziona]
double[] balances = calPeoBal.getBalanceCursor(); // SECONDA COLONNA
                                                                                                                        // DELLA LV

Cosa mi consigliate di fare? Stavo pensando che forse convertire anche il Cursor in un array e poi in qualche modo inserirli come array appunto. Che dite? è fattivile?
Ciao, grazie ;-)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:ListView "IBRIDO"
« Risposta #3 il: 02 Giugno 2011, 19:47:38 CEST »
+1
Devi crearti un adapter personalizzato, per esempio questo dovrebbe funzionare:
Codice (Java): [Seleziona]
public class mAdapter extends BaseAdapter {

        double[] balances;
        Cursor cursor;
        int viewId;
        LayoutInflater mInflater;

        // Inizializza l'adapter
        public mAdapter(Context context, Cursor cursor, double[] balances,
                        int viewId) {
                super();
                this.balances = balances;
                this.cursor = cursor;
                this.viewId = viewId;
                mInflater = LayoutInflater.from(context);

        }

        // Serve per contare quanti sono gli elementi da visualizzare
        @Override
        public int getCount() {
                return cursor.getCount();
        }

        // Serve in un eventuale onClickListener. Se lo utilizzi, modificalo per
        // ritornare quello che ti serve.
        @Override
        public Object getItem(int position) {
                return null;
        }

        @Override
        public long getItemId(int position) {
                return 0;
        }

        //Gestisce le view di ogni riga
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                cursor.moveToPosition(position);
                //Prende il file del layout
                convertView = mInflater.inflate(viewId, null);
                //Trova le due textView
                TextView textView1 = (TextView) convertView
                                .findViewById(R.id.tv_rowSplitName);
                TextView textView2 = (TextView) convertView
                                .findViewById(R.id.tv_rowSplitBalance);
                //Imposta i valori della textView

                textView1.setText(cursor.getString(AppDB.peoName)); //Se AppDB.peoName è la posizione della colonna, sennò
                textView1.setText(cursor.getString(cursor.getColumnIndex(AppDB.peoName))); // Se AppDB.peoName è la stringa col nome della colonna del database
                textView2.setText("" + balances[position]);
                return convertView;
        }

}

E lo usi in questo modo:
Codice (Java): [Seleziona]
                adapter1colLV = new BaseAdapter(this,   cPeopleByEvent, calPeoBal.getBalanceCursor(), R.layout.row_split);

                splitLv.setAdapter(adapter1colLV);

Ci sarebbero poi delle modifiche da fare per migliorarne la velocità, ma l'ho lasciato semplice per non complicarne la comprensione.
« Ultima modifica: 02 Giugno 2011, 19:56:04 CEST da Verandi »

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:ListView "IBRIDO"
« Risposta #4 il: 02 Giugno 2011, 20:53:38 CEST »
0
Devi crearti un adapter personalizzato, per esempio questo dovrebbe funzionare:
Codice (Java): [Seleziona]
public class mAdapter extends BaseAdapter {

        double[] balances;
        Cursor cursor;
        int viewId;
        LayoutInflater mInflater;

        // Inizializza l'adapter
        public mAdapter(Context context, Cursor cursor, double[] balances,
                        int viewId) {
                super();
                this.balances = balances;
                this.cursor = cursor;
                this.viewId = viewId;
                mInflater = LayoutInflater.from(context);

        }

        // Serve per contare quanti sono gli elementi da visualizzare
        @Override
        public int getCount() {
                return cursor.getCount();
        }

        // Serve in un eventuale onClickListener. Se lo utilizzi, modificalo per
        // ritornare quello che ti serve.
        @Override
        public Object getItem(int position) {
                return null;
        }

        @Override
        public long getItemId(int position) {
                return 0;
        }

        //Gestisce le view di ogni riga
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                cursor.moveToPosition(position);
                //Prende il file del layout
                convertView = mInflater.inflate(viewId, null);
                //Trova le due textView
                TextView textView1 = (TextView) convertView
                                .findViewById(R.id.tv_rowSplitName);
                TextView textView2 = (TextView) convertView
                                .findViewById(R.id.tv_rowSplitBalance);
                //Imposta i valori della textView

                textView1.setText(cursor.getString(AppDB.peoName)); //Se AppDB.peoName è la posizione della colonna, sennò
                textView1.setText(cursor.getString(cursor.getColumnIndex(AppDB.peoName))); // Se AppDB.peoName è la stringa col nome della colonna del database
                textView2.setText("" + balances[position]);
                return convertView;
        }

}

E lo usi in questo modo:
Codice (Java): [Seleziona]
                adapter1colLV = new BaseAdapter(this,   cPeopleByEvent, calPeoBal.getBalanceCursor(), R.layout.row_split);

                splitLv.setAdapter(adapter1colLV);

Ci sarebbero poi delle modifiche da fare per migliorarne la velocità, ma l'ho lasciato semplice per non complicarne la comprensione.


Ti ringrazio Verandi, funziona alla grande! avanzi una birra!  ;-)