2011-11-19 6 views
11

Ho uno stringa JSON con le molteplici istanze del seguenteQuale adattatore usare - BaseAdapter o ArrayAdapter?

  1. Nome
  2. Messaggio
  3. timestamp
  4. Foto di profilo url

Voglio creare un controllo ListView in cui ogni lista avrà il sopra. Qual è l'adattatore migliore che ho bisogno di estendere per questo caso particolare, per creare un adattatore personalizzato?

+1

http://stackoverflow.com/questions/3349693/baseadapter-or-arrayadaptor-android controlla questo. –

risposta

11

La mia ipotesi è che sia stata analizzata la stringa JSON in un modello di oggetto prima di considerare entrambi i casi ... chiamiamo questo profilo di classe.

Strategia 1

Un ArrayAdapter è sufficiente con un metodo sovresposta GetView (..) che concatenare le vostre più campi insieme nel modo che desiderate.

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v; 
     // use the ViewHolder pattern here to get a reference to v, then populate 
     // its individual fields however you wish... v may be a composite view in this case 
    } 
} 

Consiglio vivamente il modello ViewHolder per potenzialmente grandi liste: https://web.archive.org/web/20110819152518/http://www.screaming-penguin.com/node/7767

Si fa una differenza enorme.

  • Vantaggio 1. consente di applicare un layout complesso per ogni punto dell'ordine del ListView.
  • Vantaggio 2. Non richiede di manipolare toString() in modo che corrisponda alla visualizzazione desiderata (dopo tutto, mantenere la logica di visualizzazione e modello separata non è mai una cattiva pratica di progettazione).

Strategia 2

In alternativa, se il metodo toString() sul tuo rappresentante di classe ha già un formato che sia accettabile per la visualizzazione è possibile utilizzare ArrayAdapter senza sostituire GetView().

Questa strategia è più semplice, ma ti costringe a distruggere tutto in una stringa per la visualizzazione.

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles) 
+0

okay grazie :) qualche ragione in particolare? –

+4

Ignorare BaseAdapter in questo caso aggiunge ulteriore complessità senza alcun reale vantaggio. Dovrai implementare getCount(), getItemId(), getItem (..), ecc. E scoprirai che le tue implementazioni sono abbastanza ottimali. – jkschneider

+0

@jkschneider - risposta perfetta. Esattamente il ragionamento che avevo bisogno di usare l'adattatore di array –