¿Cómo manipular los datos del cursor antes de mostrarlo en un ListView (usando un cargador)?

Cada elemento de mi SherlockListFragment contiene 3 TextView s: un nombre y dos números. Los datos provienen del objective de la tabla de mi base de datos, que tiene la siguiente estructura:

 CREATE TABLE objective ( _id INTEGER PRIMARY KEY, id_project INTEGER NOT NULL, activity_code INTEGER NOT NULL, day_duration INTEGER NOT NULL, week_frequency INTEGER NOT NULL, FOREIGN KEY(id_project) REFERENCES project(id_project) ); 

Por otra parte, he leído que poblar una lista de un cursor debe hacerse utilizando un cargador (especialmente cuando se utiliza una base de datos porque puede ser una operación muy lenta). He encontrado una clase SimpleCursorLoader aquí en stackoverflow , pero asigna datos a un campo directamente.

Eso no es realmente lo que quiero, porque como se puede ver, en mi tabla de objective tengo un activity_code . Así que me gustaría reemplazarlo por una cadena (tengo un Enum que lista todos los códigos de mi actividad y devuelve, para cada uno, un identificador de recurso de cadena).

¿Sabe cómo podría manipular los datos antes de que se muestra en el TextView ?

Aquí está mi SherlockListFragment

 public class ObjectivesDisplayFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> { private Activity activity; private SimpleCursorAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.objectives_display, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); activity = getActivity(); String[] columns = new String[] { "activity_code", "day_duration", "week_frequency" }; int[] to = new int[] { R.id.activityName, R.id.objectiveDuration, R.id.objectiveFrequency }; getLoaderManager().initLoader(0x01, null, this); adapter = new SimpleCursorAdapter(activity.getApplicationContext(), R.layout.objective_row, null, columns, to, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); setListAdapter(adapter); } public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { return new SimpleCursorLoader(activity) { @Override public Cursor loadInBackground() { DatabaseHelper dbHelper = DatabaseHelper.getInstance(activity); String query = "SELECT _id, activity_code, day_duration, week_frequency FROM objective WHERE id_project = ?"; String[] args = new String[] { "1" }; // projectId Cursor results = dbHelper.getReadableDatabase().rawQuery(query, args); return results; } }; } public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) { adapter.swapCursor(cursor); } public void onLoaderReset(Loader<Cursor> arg0) { adapter.swapCursor(null); } } 

EDIT: No necesito cerrar el cursor y la base de datos en SimpleCursorLoader> loadInBackground, ¿verdad? De lo contrario, no se podrían leer los datos. ¿Así es la operación de cierre manejada automáticamente o necesito hacerlo yo mismo en otra parte?

Supongo que esto puede funcionar para usted:

 adapter.setViewBinder(new ViewBinder(){ @Override public boolean setViewValue(View view, Cursor cursor, int columnIndex) { String label = "Inactive"; if(columnIndex == 4) { if(cursor.getInt(columnIndex) == 1) { label = "Active"; } TextView tv = (TextView) view.findViewById(R.id.status); tv.setText(label); return true; } return false; } }); setListAdapter(adapter); 

Información de fondo: Tenía una columna de clave externa (entero) en la tabla y quería resolver a su valor de cadena (de la tabla vinculada) al rellenar en la vista de lista. La columna estaba en el cuarto índice (la quinta columna en el conjunto), por lo que acaba de usar setViewBinder () para manipular la columna requerida.

Además mi diseño tenía 5 vistas de texto para mostrar los 5 campos desde el cursor. Una cosa también NOTICEABLE aquí es, cuando se utiliza "si" las condiciones para captar los índices de columna, asegúrese de que cada bloque condicional debe contener "return true". En tal caso, donde el intérprete llega a "devolver false" – significa que su campo no se manipuló.

Estoy seguro de que el bloque de código anterior es bastante simple y fácil de entender.

  • Obtener datos de la base de datos en una estructura de árbol en sqlite
  • Encriptación de la base de datos de Android
  • Sincronización cliente-servidor sobre REST
  • ¿Cómo conectar el teléfono de android a un servicio de la tela funcionado en el servidor local?
  • ¿Qué pasó con la eliminación de elementos de realm.io? RealmException "No se admite el objeto de eliminación".?
  • Acceso a bases de datos en Android
  • ¿Tengo que usar _ID como una clave primaria de SQlite? Y tiene que ser un INT? (Android Dev)
  • Eliminar todas las tablas de la base de datos sqlite
  • ¿Cuál es el mecanismo de setNotificationUri?
  • ¿Cómo puedo comprobar si mi tabla sqlite contiene datos?
  • Reiniciar CursorLoader no refleja la eliminación de la base de datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.