¿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.
- Bases de datos de sincronización Mysql SQLite
- Conectar la aplicación android con la base de datos de un sitio web
- Cómo agregar datos en la base de datos al hacer clic en el botón?
- ¿Es posible acceder a la base de datos desde un servicio?
- Podemos usar truncar consulta en android sqlite
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?
- No se puede mostrar el tiempo unix obtenido en textView
- Encontrar el punto Gps más cercano a la ubicación del usuario forma una lista
- Android - Contenido Valores sobre la escritura de filas existentes
- Cómo deshabilitar la exploración de modelo en Activeandroid
- Las inserciones de SQLite se vuelven más lentas incluso con transacciones
- Una aplicación Android de Firebase con autenticación de cliente / aplicación en lugar de autenticación de usuario
- Usando COLLATE en Android SQLite - Locales se ignora en la instrucción LIKE
- Populating Spinner de la base de datos SQLite Android
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.
- Dibujar contenido de TextView actual en Bitmap
- ¿Utilizando Ant cómo puedo dex un directorio de jarras?