2012-10-12 9 views
30

Uso sempre lo schema ViewHolder nelle mie classi personalizzate ArrayAdapter. Tuttavia, in CursorAdapter il metodo getView() non è obbligatorio per essere sovrascritto, ma ha i metodi bindView e newView.Android - Il pattern ViewHolder è implementato automaticamente in CursorAdapter?

La mia domanda è - fa CursorAdapter riutilizza vista implementando internamente il modello ViewHolder o ha bisogno di essere codificate come facciamo normalmente in costume ArrayAdapter? Se ha bisogno di essere codificato, qual è il modo corretto per farlo?

Aggiornamento

sto usando android.support.v4.widget.CursorAdapter

risposta

39

La mia domanda è - fa CursorAdapter ri-utilizza viste Di internamente attuazione del modello ViewHolder o ha bisogno di essere codificato come noi normalmente facciamo in ArrayAdapter personalizzato?

Non sono sicuro di cosa si fa riferimento per il modello ViewHolder. Se ti stai riferendo ad avere una classe helper in cache cercando ogni volta la visualizzazione (e impostandola come tag per la riga View) la risposta è no. Se si desidera implementare questo modello, è necessario impostare il titolare (cercare le viste nella vista riga con findViewById) nel metodo newView e impostarlo come tag per la vista riga. Quindi nel metodo bindView è possibile chiamare getTag, recuperare il titolare e utilizzarlo. Un esempio:

// custom CursorAdapter ... 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View rowView = ((LayoutInflater) context 
       .getSystemService("layout_inflater")).inflate(
       R.layout.row_layout, parent, false); 
     ViewHolder holder = new ViewHolder(); 
     holder.v1 = rowView.findViewById(R.id.v1); 
     holder.v2 = rowView.findViewById(R.id.v2); 
     rowView.setTag(holder); 
     return rowView; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     // use the holder filled with views 
     // hlder.v1.setSomething 
    } 

    class ViewHolder { 
     View v1, v2; 
    } 
// ... 

se si fa riferimento alla convertView essere riutilizzato (come in Cursor adattatori non basate) allora la risposta è sì, il metodo getView implementa questo modello, è sufficiente implementare i metodi newView e bindView e hai la garanzia di ottenere una vista che è stata riciclata (se possibile in quel momento).

+0

da 'ViewHolder' intendo il modello' titolare della licenza ... –

+0

@Mahendra Così è stato il primo caso. No, il pattern del titolare non è implementato in 'CursorAdapter' (dall'SDK o dal pacchetto di compatibilità). – Luksprog

+0

La mia domanda riguarda più la 'codifica del 'Titolare' nell'adattatore personalizzato o non è necessario'? Vedo che la classe 'CursorAdapter' ha anche il metodo' getView' .. –