Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: ¿Cómo Requerir un Cursor para actualizar ListView después de eliminar la fila de la base de datos?

Esto puede ser una pregunta de noob, pero soy bastante nuevo en todo esto SQLite-Database-Cursor-Adapter-ListView-Do-It-Properly-Stuff.

Lo que tengo:

  • Android abriendo el menú contextual después de hacer clic en el botón
  • Android 4.0: widgets no aparecen?
  • Android ScrollView problema de diseño
  • Pérdida de variables orientaciones de conmutación
  • Selector de horas / minutos para el temporizador de cuenta atrás de Android
  • Lona transparente para Android con transparencia
  • En mi MainActivity tengo un ListView . Utilizo una SQLite database y SimpleCursorAdapter el ListView con un adaptador de encargo que extiende SimpleCursorAdapter . Al hacer clic en un elemento de mi ActionBar activar el Contextual Action Mode . Todo está funcionando hasta ahora.

    Lo que quiero:

    Al hacer clic en un icono determinado en mi ListView item la fila correspondiente de la base de datos debe ser eliminada y el ListView debe ser actualizado.

    Mi pregunta:

    ¿Cómo actualizo mi Cursor y mi ListView correctamente? Cuando no uso cursor.requery() en mi OnClickListener y el uso del cursor = dbm.getIOIOSensorsCursor() lugar de otro consigo un CursorIndexOutOfBoundsException algunas filas abajo en la línea

     int state = cursor.getInt(cursor.getColumnIndex(IOIOSensorSchema.STATE)); 

    Mi aplicación se bloquea, pero después de recargarla, la base de datos se ha eliminado y el ListView item acuerdo se ha ido.

    Supongo que el accidente debe tener algo que ver con _position en obtener getView método porque _position es final . Sin embargo, cuando uso cursor.requery() todo funciona como debería.

    Pero este método está obsoleto y su documentación dice "No utilice esto …" . Soy un amigo de la codificación correctamente (sigo siendo un principiante y quiero aprender a codificar el camino correcto y no rápido y sucio) y quiero saber cómo hacer esto bien. No sé si es importante, pero estoy probando mi aplicación sólo en mi (muy rápido) Nexus 4. Parece que no hay problemas con la actualización de Cursor lo suficientemente rápido, pero me pregunto si funcionará en dispositivos más lentos. En caso de que sea importante para usted mi base de datos contendrá alrededor de 10-20 filas con alrededor de 12 columnas. Supongo que esta es una base de datos muy pequeña.

    Aquí está el código relevante de mi adaptador personalizado:

     public class IOIOSensorCursorAdapterCam extends SimpleCursorAdapter { static class ViewHolder { ImageView stateIV, removeIV; TextView nameTV, pinNumberTV, feedIDTV, freqTV; } private Context ctx; private Cursor cursor; private IodDatabaseManager dbm; public IOIOSensorCursorAdapterCam(Context _context, int _layout, Cursor _cursor, String[] _from, int[] _to, int _flags) { super(_context, _layout, _cursor, _from, _to, _flags); ctx = _context; cursor = _cursor; dbm = new IodDatabaseManager(_context); } @Override public View getView(final int _position, View _convertView, ViewGroup _parent) { ViewHolder holder = null; LayoutInflater inflater = (LayoutInflater) ctx .getSystemService(Context.LAYOUT_INFLATER_SERVICE); // There is no view at this position, we create a new one. In this case // by inflating an xml layout. if (_convertView == null) { // Inflate a layout _convertView = inflater.inflate(R.layout.listview_item_sensor_cam, null); holder = new ViewHolder(); holder.stateIV = (ImageView) _convertView .findViewById(R.id.stateImageView); holder.nameTV = (TextView) _convertView .findViewById(R.id.sensorNameTextView); holder.pinNumberTV = (TextView) _convertView .findViewById(R.id.sensorPinNumberTextView); holder.feedIDTV = (TextView) _convertView .findViewById(R.id.sensorFeedIDTextView); holder.freqTV = (TextView) _convertView .findViewById(R.id.sensorFrequencyTextView); holder.removeIV = (ImageView) _convertView .findViewById(R.id.removeImageView); _convertView.setTag(holder); } // We recycle a View that already exists. else { holder = (ViewHolder) _convertView.getTag(); } // Set an OnClickListener to the "Delete Icon" holder.removeIV.setOnClickListener(new OnClickListener() { @SuppressWarnings("deprecation") @Override public void onClick(View _view) { cursor.moveToPosition(_position); // Delete sensor from database here int sensorID = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.SENSOR_ID)); dbm.deleteIOIOSensor(sensorID); // This leads to a "CursorIndexOutOfBoundsException" and cannot // be used to refresh the ListView // cursor = dbm.getIOIOSensorsCursor(); // Refresh ListView cursor.requery(); notifyDataSetChanged(); } }); cursor.moveToPosition(_position); if (cursor.getCount() > 0) { int state = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.STATE)); if (state == 0) { holder.stateIV.setImageResource(R.drawable.av_play_over_video); holder.stateIV.setColorFilter(ctx.getResources().getColor( R.color.hint_lighter_gray)); // _convertView.setAlpha((float) 0.5); holder.nameTV.setTextColor(ctx.getResources().getColor( R.color.hint_darker_gray)); } else { holder.stateIV.setImageResource(R.drawable.av_pause_over_video); holder.stateIV.setColorFilter(ctx.getResources().getColor( android.R.color.holo_green_light)); // _convertView.setAlpha((float) 1); holder.nameTV.setTextColor(ctx.getResources().getColor( android.R.color.black)); } // Set the sensor's name to the according TextView String sensorName = cursor.getString(cursor .getColumnIndex(IOIOSensorSchema.NAME)); holder.nameTV.setText(sensorName); // Set the sensor's pin number to the according TextView int pinNumber = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.PIN_NUMBER)); holder.pinNumberTV.setText("" + pinNumber); // Set the sensor's feed ID to the according TextView int feedID = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.FEED_ID)); holder.feedIDTV.setText("" + feedID); // Set the sensor's frequency to the according TextView int frequency = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.FREQUENCY)); int timeUnit = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.TIME_UNIT)); String frequencyTextViewText = ""; switch (timeUnit) { case IodIOIOSensor.TIME_UNIT_MINUTES: frequencyTextViewText = frequency + " min"; break; case IodIOIOSensor.TIME_UNIT_HOURS: frequencyTextViewText = frequency + " h"; break; default: frequencyTextViewText = frequency + " sec"; break; } holder.freqTV.setText(frequencyTextViewText); } return _convertView; } } 

    Editar:

    Aquí está mi código relevante del OnCickListener después de implementar la solución:

     // Set an OnClickListener to the "Delete Icon" holder.removeIV.setOnClickListener(new OnClickListener() { @Override public void onClick(View _view) { cursor.moveToPosition(_position); // Delete sensor from database here int sensorID = cursor.getInt(cursor .getColumnIndex(IOIOSensorSchema.SENSOR_ID)); dbm.deleteIOIOSensor(sensorID); Toast.makeText(ctx, R.string.toast_sensor_deleted, Toast.LENGTH_SHORT).show(); // Refresh ListView cursor = dbm.getIOIOSensorsCursor(); swapCursor(cursor); notifyDataSetChanged(); } }); 

  • No se puede ejecutar en dispositivos de producción
  • Cajón de navegación de ancho total
  • Android y Facebook SDK: descodificación de imágenes de / me / picture graph call
  • Android: problemas para actualizar a Android SDK Tools, revisión 7
  • Notificaciones expandibles personalizadas en Jelly Bean (4.1)
  • Android - Control de una tarea con Timer y TimerTask?
  • One Solution collect form web for “Android: ¿Cómo Requerir un Cursor para actualizar ListView después de eliminar la fila de la base de datos?”

    ¿Cómo actualizo mi Cursor y mi ListView correctamente?

    Usted "refresca [su] Cursor" ejecutando su código de nuevo para obtener el Cursor , usando el código que usó para crear el Cursor original (en un hilo de fondo, por favor). Actualizar su ListView llamando a changeCursor() o swapCursor() en el CursorAdapter .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.