2011-12-12 13 views
42

Sto provando a creare un cursore personalizzato che utilizzerà due layout diversi a seconda di alcuni dati nel cursore. Continuo a leggere sull'overriding di getViewTypeCount() e getItemViewType() 'per farlo accadere ma non riesco a capire come implementarlo.cursoradapter con layout di righe differenti

Questo è il mio codice per i metodi bindView e new View:

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView tView = (TextView) view.findViewById(R.id.TextView1); 
    tView.setText("The text"); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return mInflater.inflate(R.layout.item1, parent, false); 
} 

.

EDIT: Ora ho questo lavoro, ma voglio scegliere cosa rowlayout da usare a seconda di alcuni dati del cursore e non posso ottenere che il lavoro .. Qualcuno ha qualche idea?

@Override 
public int getItemViewType(int position) { 
    return position % 2; 
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.txtAddress 
      .setText("blabla"); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 
    View v = null; 
    int type = cursor.getPosition() % 2; 
    if(type == 0) { 
     v = mInflater.inflate(R.layout.item, parent, false); 
    } else { 
     v = mInflater.inflate(R.layout.item2, parent, false); 
    } 

    holder.txtAddress = (TextView) v.findViewById(R.id.tvName); 

    v.setTag(holder); 
    return v; 
} 
+0

Stai cercando di aggiungere sezioni/intestazioni al tuo visualizzazione elenco? Mark Murphy ha creato un adattatore per elenco cwac-merge davvero facile da usare. – csaunders

+0

No, ho 2 layout diversi e talvolta voglio usare layout1 se mCursor.getString (mCursor.getColumnIndex ("type")). Equals ("1") e voglio usare layout2 quando mCursor.getString (mCursor.getColumnIndex ("tipo")). equals ("2") – jagsler

+0

Se si desidera, è possibile afferrare due cursori separati. Uno dove scrivi == 1 e uno per dove type == 2. È ghetto, ma potrebbe aiutarti ad andare avanti. – csaunders

risposta

89

Quindi ho finalmente funzionato. Per gli interessati il ​​codice di lavoro è al di sotto:

private int getItemViewType(Cursor cursor) { 
    String type = cursor.getString(cursor.getColumnIndex("type")); 
    if (type.equals("1")) { 
     return 0; 
    } else { 
     return 1; 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    Cursor cursor = (Cursor) getItem(position); 
    return getItemViewType(cursor); 
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.textView 
      .setText(cursor.getString(cursor.getColumnIndex("body"))); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 
    View v = null; 

    if (cursor.getString(cursor.getColumnIndex("type")).equals("1")) { 
     v = mInflater.inflate(R.layout.message1, parent, false); 
     holder.textView = (TextView) v 
       .findViewById(R.id.textView1); 
    } else { 
     v = mInflater.inflate(R.layout.message2, parent, false); 
     holder.textView = (TextView) v 
       .findViewById(R.id.textView2); 
    } 

    v.setTag(holder); 
    return v; 
} 

public static class ViewHolder { 
    public TextView textView; 
} 
+0

getItem (posizione) chiama moveToPosition (posizione) sull'oggetto cursore interno, e sospetto che sia un po 'troppo costoso per essere chiamato così spesso . Lo fai scorrere con fluidità nella tua app? –

+2

Sì scorre perfettamente. Codice trovato come questo nel codice sorgente di Android. – jagsler

+0

@jagsler Sto cercando di ottenere qualcosa di simile, hai notato un problema durante il quale lo scorrimento dei layout della vista viene modificato in qualche modo? – kabuto178

2

Date un'occhiata a questo example, si può facilmente adattare per risolvere il vostro problema. È piuttosto semplice.

+0

Grazie per l'esempio. Penso di aver capito (la maggior parte parte) il codice fornito nell'esempio ma mi confondo al punto in cui non ho un metodo getView ma un metodo newView e bindView .. come posso implementare il codice dato nell'esempio in il mio caso? – jagsler

+1

CursorAdapter ha un'implementazione di getView() che delega a newView() e bindView(), in modo tale da imporre il pattern di riciclo delle righe. Quindi in newView(), crei ViewHolder per la riga e lo associ a setTag(). In bindView(), si recupera ViewHolder tramite getTag(); alla fine hai solo bisogno di adattare/dividere la stessa logica tra i 2 metodi. Occupato ora, ma posso scrivere un codice stasera nel caso tu abbia bisogno ... – gwa

+0

Grazie per le informazioni! Per prima cosa ci provero ', ma ti farò sapere se non funziona. – jagsler

0

Un'altra possibile soluzione per quanto riguarda l'accesso al cursore nel metodo getItemViewType è la seguente:

@Override 
public int getChildType(int groupPosition, int childPosition) { 
    Cursor c = getChild(groupPosition, childPosition); 
    if(c.getString(c.getColumnIndex(Contract.MyColumn)).equals("value")) 
     return 0; 
    else return 1; 
} 
Problemi correlati