Autore Topic: [ListView] Righe con layout diverso e popolamento "dinamico"  (Letto 2607 volte)

Offline Noisemaker

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
[ListView] Righe con layout diverso e popolamento "dinamico"
« il: 07 Giugno 2012, 10:13:18 CEST »
0
Avrei bisogno di qualche dritta per realizzare quanto scritto nel titolo. Spiegando meglio, io ho una ListView per la quale ho creato un adatpter estendendo il CursorAdapter. A me servirebbero le seguenti cose:

1) le varie righe devono avere un layout custom sulla base del contenuto. Sto leggendo dei messaggi quindi vorrei che gli inviati fossero dalla parte DX e i ricevuti sulla SX. Ho implementato la cosa nel newView del mio adapter, ma ovviamente non funziona. O meglio funziona per come è strutturata la list view ovvero crea le view per gli elementi "visibili" e poi le riutilizza. Quindi mi trovo il problema che se magari ho 2 messaggi consecutivi inviati o ricetuti siano magari uno a DX e l'altro a SX perchè le view precedenti erano state caricate così. Quindi vi chiedo: come faccio ad aggiornare il layout mentre scorro la lista? Devo mettere il tutto dentro bindData??

2) se i messaggi sono tanti, ha senso caricarne solo una parte ed aggiornare la listView se l'utente decide di scrollare verso quelli vecchi?

Grazie a tutti per l'aiuto :) :)

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[ListView] Righe con layout diverso e popolamento "dinamico"
« Risposta #1 il: 07 Giugno 2012, 11:36:10 CEST »
0
allora, per il riciclo delle view, c'è come hai già fatto il metodo newView, ma ce n'è anche un'altro che devi sovrascrivere apposta per evitare l'errore che hai. Al momento non mi ricordo il nome, ma il metodo c'è. Li dentro devi rifare la verifica per spostare a destra o sinistra.

al punto 2, secondo me ha senso, ovviamente QUANTI messaggi lo devi decidere te, GO SMS se non sbaglio ne ha 100 totali (tra inviati e ricevuti)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Noisemaker

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
Re:[ListView] Righe con layout diverso e popolamento "dinamico"
« Risposta #2 il: 07 Giugno 2012, 12:34:58 CEST »
0
Si immaginavo ci fosse un metodo di cui fare l'override che gestisce diciamo l'update... non riesco a trovare nulla però, ora mi guardo la documentazione del CursorAdapter. ;)

Offline Noisemaker

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • Mostra profilo
Re:[ListView] Righe con layout diverso e popolamento "dinamico"
« Risposta #3 il: 07 Giugno 2012, 14:34:49 CEST »
0
Niente....non riesco a capire qual'è il metodo :(

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[ListView] Righe con layout diverso e popolamento "dinamico"
« Risposta #4 il: 07 Giugno 2012, 19:09:10 CEST »
0
questo è un estratto di ciò che facevo io....
Codice (Java): [Seleziona]
public class DiaryNoteListAdapter extends SimpleCursorAdapter implements Filterable {

        private int mLayout;
        private MYDB mMyDb = null;
        private String[] columnNames;
        private int[] to;
        // index for columns
        private int noteIdCol;
        private int entryTypeCol;
        private int textCol;
        private int doerNameCol;
        private int creationTimeColumn;
        private int typeCodeColumn;
        // this id is the id of the diaryNote (_id in android DB). Given this Id we can have all info.
        private long _Id;
        private String diaryNoteText;
        private String diaryEntryType;
        private int diaryEntryTypeCode;
        private long creationTimestamp;
        private SimpleDateFormat diaryNoteTimeFormat;
        private Drawable icon_note, icon_prest;

        public DiaryNoteListAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
                super(context, layout, c, from, to);
                this.mLayout = layout;
                this.columnNames = from;
                this.to = to;
                // Tables.DiaryNoteMD.ID,Tables.DiaryNoteMD.ENTRY_TYPE, Tables.DiaryNoteMD.TEXT_KEY, Tables.DiaryNoteMD.DOER_NAME_KEY,
                // Tables.DiaryNoteMD.CREATION_TIMESTAMP
                mMyDb = new MyDB(context);
                diaryNoteTimeFormat = Variables.dateFormat_dd_MM_yy;
                icon_note = context.getResources().getDrawable(R.drawable.list_icon_note);
                icon_prest = context.getResources().getDrawable(R.drawable.list_icon_prest);
                noteIdCol = c.getColumnIndex(columnNames[0]);
                entryTypeCol = c.getColumnIndex(columnNames[1]);
                textCol = c.getColumnIndex(columnNames[2]);
                doerNameCol = c.getColumnIndex(columnNames[3]);
                creationTimeColumn = c.getColumnIndex(columnNames[4]);
                typeCodeColumn = c.getColumnIndex(columnNames[5]);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
                Cursor c = getCursor();
                final LayoutInflater inflater = LayoutInflater.from(context);
                View v = inflater.inflate(mLayout, parent, false);
                // get values
                creationTimestamp = c.getLong(creationTimeColumn);
                diaryNoteText = c.getString(textCol);
                diaryEntryType = c.getString(entryTypeCol);
                diaryEntryTypeCode = c.getInt(typeCodeColumn);
                _Id = c.getLong(noteIdCol);
                v.setTag(_Id);
                // get views
                ImageView icon = (ImageView) v.findViewById(to[0]);
                TextView noteText = (TextView) v.findViewById(to[1]);
                TextView date = (TextView) v.findViewById(to[2]);
                TextView doerName = (TextView) v.findViewById(to[3]);
                // set views
                noteText.setText(diaryNoteText);
                date.setText(diaryNoteTimeFormat.format(new Date(creationTimestamp)));
                doerName.setText(c.getString(doerNameCol));
                if (diaryEntryType.equalsIgnoreCase(Variables.ENTRY_TYPE_NOTE)) {
                        icon.setImageDrawable(icon_note);
                } else if (diaryEntryType.equalsIgnoreCase(Variables.ENTRY_TYPE_TREATMENT)) {
                        icon.setImageDrawable(icon_prest);
                        if (mMyDb == null) {
                                mMyDb = new mMyDb (context);
                        }
                        mMyDb .open();
                        noteText.setText(mMyDb .getTreatmentNameByTreatmentCode(diaryEntryTypeCode));
                        mMyDb .close();
                }
                return v;
        }

        @Override
        public void bindView(View v, Context context, Cursor c) {
                // get values
                creationTimestamp = c.getLong(creationTimeColumn);
                diaryNoteText = c.getString(textCol);
                diaryEntryType = c.getString(entryTypeCol);
                _Id = c.getLong(noteIdCol);
                v.setTag(_Id);
                // getViews
                ImageView icon = (ImageView) v.findViewById(to[0]);
                TextView noteText = (TextView) v.findViewById(to[1]);
                TextView date = (TextView) v.findViewById(to[2]);
                TextView doerName = (TextView) v.findViewById(to[3]);
                // set views
                noteText.setText(diaryNoteText);
                date.setText(diaryNoteTimeFormat.format(new Date(creationTimestamp)));
                doerName.setText(c.getString(doerNameCol));
                if (diaryEntryType.equalsIgnoreCase(Variables.ENTRY_TYPE_NOTE)) {
                        icon.setImageDrawable(icon_note);
                } else if (diaryEntryType.equalsIgnoreCase(Variables.ENTRY_TYPE_TREATMENT)) {
                        icon.setImageDrawable(icon_prest);
                        if (mMyDb == null) {
                                mMyDb = new mMyDb (context);
                        }
                        mMyDb .open();
                        noteText.setText(mMyDb .getTreatmentNameByTreatmentCode(diaryEntryTypeCode));
                        mMyDb .close();
                }
        }

}
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia