CursorAdapter optimización bindView

Al reemplazar ArrayAdapter sé que es correcto usando un patrón como este:

if(view != null){ ...create new view setting fields from data }else return view; //reuse view 

Es correcta también utilizando este patrón con CursorAdapters? Mi problema es que tengo un textcolor que puede ser rojo o azul según un campo del cursor, así que no quiero ningún error como un color rojo en una célula que tenga un campo que necesita el color azul. Mi código bindView es algo como esto:

 if(c.getString(2).equals("red")) textView.setTextColor(<red here>); else textView.setTextColor(<blue here>); 

Si vuelvo a usar la vista puedo estar seguro de que el rojo va en rojo, mientras que el azul va en azul?

En CursorAdapter , obtiene el diseño en newView y enlaza datos en bindView . CursorAdapter ya hace el patrón de reutilización en getView para que no tenga que hacerlo de nuevo . A continuación se muestra el código fuente original getView .

  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; } 

Si desea una mayor optimización utilizando ViewHolder Pattern aquí es un ejemplo: Crear etiqueta en newView y recuperar en bindView

  public class TimeListAdapter extends CursorAdapter { private LayoutInflater inflater; private static class ViewHolder { int nameIndex; int timeIndex; TextView name; TextView time; } public TimeListAdapter(Context context, Cursor c, int flags) { super(context, c, flags); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); holder.name.setText(cursor.getString(holder.nameIndex)); holder.time.setText(cursor.getString(holder.timeIndex)); } @Override public View newView(Context context, Cursor cursor, ViewGroup p parent) { View view = inflater.inflate(R.layout.time_row, null); ViewHolder holder = new ViewHolder(); holder.name = (TextView) view.findViewById(R.id.task_name); holder.time = (TextView) view.findViewById(R.id.task_time); holder.nameIndex = cursor.getColumnIndexOrThrow p (TaskProvider.Task.NAME); holder.timeIndex = cursor.getColumnIndexOrThrow p (TaskProvider.Task.DATE); view.setTag(holder); return view; } } 

Sí, getView está en el Adapter y no es dependiente de ArrayAdapter ni de CursorAdapter .

El reciclaje es siempre una buena práctica. Asegúrese de que su código establece un color en cada situación.

  • SimpleCursorAdapter vs CursorAdapter?
  • Cómo actualizar la lista con el adaptador Cursor
  • Android - Visualización de los resultados del cursor de DB en ListView
  • Uso de Android SimpleCursorAdapter y CursorLoader
  • Arrastrar y soltar la clasificación de adaptador de cursor y adaptador de lista
  • Unir varios registros en un CursorAdapter
  • Adaptador de cursor simple requiere mínimo api 11 cuestión
  • ListView no se actualiza correctamente CursorAdapter después de swapCursor
  • Casilla de verificación en CursorAdapter
  • Android: Ampliación del libro de contactos del usuario. Rendimiento ContentProvider vs Sqlite vs Lista en la memoria
  • Android: Cómo crear CursorAdapter desde los datos en un archivo XML
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.