2010-08-20 24 views

Respuesta

72

CursorAdapter tiene una implementación de getView() que los delegados a newView() y bindView(), de tal manera que hace cumplir el patrón de filas de reciclaje. Por lo tanto, no necesita hacer nada especial con un CursorAdapter para el reciclaje de filas si está anulando newView() y bindView().

+6

¿Cómo aplicaría el patrón ViewHolder? ¿Lo dividiría entre newView() y bindView()? –

+17

@Scienceprodigy: en 'newView()', crearía el 'ViewHolder' para la fila y lo asociaría con' setTag() '. En 'bindView()', recuperaría 'ViewHolder' mediante' getTag() '. – CommonsWare

+0

Gracias, eso funciona. Sin embargo, estoy teniendo problemas con el reciclaje de las vistas, porque tengo elementos de la lista que tienen un encabezado que se GONE por defecto, que utilizo para mostrar las secciones con fecha. Todo se muestra bien hasta que arrojo la lista hacia arriba o hacia abajo, luego hay encabezados que aparecen donde no deberían estar. –

18
/** 
    * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 
    */ 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (!mDataValid) { 
      throw new IllegalStateException("this should only be called when the cursor is valid"); 
     } 
     if (!mCursor.moveToPosition(position)) { 
      throw new IllegalStateException("couldn't move cursor to position " + position); 
     } 
     View v; 
     if (convertView == null) { 
      v = newView(mContext, mCursor, parent); 
     } else { 
      v = convertView; 
     } 
     bindView(v, mContext, mCursor); 
     return v; 
    } 

Este código fuente CursorAdapter, claramente cursorAdapter funciona más.

2

La aplicación CursorAdapter es diferente de los adaptadores regulares sub-clasificando como BaseAdapter, que no es necesario para anular getView(), getCount(), getItemId() porque esa información se puede recuperar desde el cursor en sí.

dado un Cursor, sólo es necesario para anular dos métodos para crear una subclase CursorAdapter:

bindView(): Dado un punto de vista, que se actualizará para mostrar los datos en el cursor proporcionado.

newView(): Esto se llama para determinar una nueva vista que entra en la lista.

El CursorAdapter se ocupará de las vistas de reciclaje (a diferencia del método getView() en el Adapter normal). No llama al newView() cada vez que necesita una nueva fila. Si ya tiene un View (no null), llamará directamente al bindView(), de esta manera, la vista creada se reutilizará. Al dividir la creación y la población de cada vista en estos dos métodos, el CursorAdapter logra la reutilización de vista donde, como en los adaptadores normales, ambas cosas se realizan en el método getView().

+2

Gracias, muy útil. – LarsH

Cuestiones relacionadas