studio importar custom agregar java android android-support-library android-design-library snackbar

java - importar - En una acción de snackbar, ¿cómo puedo estar seguro de que es seguro eliminar permanentemente un registro borrado de la base de datos?



snackbar kotlin (5)

Ejemplo:

final java.util.Timer timer = new Timer(); Snackbar snackbar = Snackbar.make(...).setAction("Undo", new OnClickListener() { @Override public void onClick(View v) { timer.cancel(); for(Word word:temp) data.add(word); adapter.notifyDataSetChanged(); } }).show(); timer.schedule(new TimerTask() { public void run() { // delete from db } }, snackbar.getDuration());

Puede ser una buena idea agregar un poco al tiempo de snackbar.getDuration () (¿100-200ms?) Ya que los temporizadores no son muy exactos en términos de tiempo y de esta manera pueden llamarse justo antes de que el snackbar esté a punto de cerrarse, Aunque la posibilidad es bastante pequeña en este caso.

Estoy usando Snackbar en Android y he implementado una acción para que el usuario pueda deshacer la acción (la acción está borrando todos los elementos en la vista de lista). Quitar y agregar los elementos nuevamente a la lista de vista ya está hecho y funciona bien.

Mi problema es que, los elementos se almacenan en la base de datos sqlite y ¿cómo puedo eliminar los elementos de las tablas? (¿Cómo puedo saber que el usuario no ha hecho clic en el botón Deshacer, de modo que puedo eliminar completamente los datos de la base de datos)?

Este es el código dentro de OnOptionsItemSelcted ()

case R.id.action_clear: final List<Word> temp = new ArrayList<Word>(data); data.clear(); adapter.notifyDataSetChanged(); View view = findViewById(R.id.layoutFavWords); Snackbar.make(view,"Deleted Saved Selection.", Snackbar.LENGTH_LONG). setAction("Undo", new OnClickListener() { @Override public void onClick(View v) { for(Word word:temp) data.add(word); adapter.notifyDataSetChanged(); } }).show(); break;

Entonces, si el usuario no ha hecho clic en el botón de deshacer durante el período visible de la barra de aperitivos, entonces necesito eliminar permanentemente los datos de la base de datos.

¿Alguna solución para esto?


La biblioteca de soporte de Android v23 agregó Snackbar.Callback que puede usar para escuchar si el snackbar fue descartado por el usuario o el tiempo de espera.

Ejemplo tomado de la astinx de astinx :

Snackbar.make(getView(), "Hi there!", Snackbar.LENGTH_LONG).setCallback( new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { switch(event) { case Snackbar.Callback.DISMISS_EVENT_ACTION: Toast.makeText(getActivity(), "Clicked the action", Toast.LENGTH_LONG).show(); break; case Snackbar.Callback.DISMISS_EVENT_TIMEOUT: Toast.makeText(getActivity(), "Time out", Toast.LENGTH_LONG).show(); break; } } @Override public void onShown(Snackbar snackbar) { Toast.makeText(getActivity(), "This is my annoying step-brother", Toast.LENGTH_LONG).show(); } }).setAction("Go away!", new View.OnClickListener() { @Override public void onClick(View v) { } }).show();


Mi camino es hv "eliminado", la columna que es booleana, solo cambia la estadística para que sea verdadera si se elimina, luego deshaga para volver a cambiar la estadística para que sea falsa, también puede que desee que el controlador de basura o el programador eliminen todos los valores falsos todas las semanas.


Por lo que yo sé, es por diseño. Debieras:

  • Borre el elemento tan pronto como el usuario toque el botón de eliminar;
  • Almacénelo temporalmente en una variable de clase;
  • Si el usuario toca Deshacer, agregue el elemento nuevamente a la base de datos.

Este enfoque es más seguro y más robusto; no debe esperar a que se deseche el snackbar, porque esa acción ni siquiera podría ocurrir. Solo piense en la fuerza de cierre de la aplicación por parte del usuario mientras la barra de aperitivos aún está encendida: ¿se debe eliminar el elemento o no? Debería.

Una fuente más confiable es esta publicación de g + por Ian Lake. En los comentarios podéis leer:

desea que su interfaz de usuario reaccione de inmediato (no espere a que desaparezca la barra de refrigerios): la mayoría de los sistemas (especialmente aquellos que se sincronizan con un servidor externo) tienen el concepto de "eliminación suave" donde las cosas se marcan como eliminadas. En esos casos, una acción de deshacer simplemente sería desmarcar el registro como eliminado. Este sistema funciona incluso si el usuario dejara la aplicación antes de que finalice la barra de aperitivos (¡no se puede asumir que la barra de bocetos siempre complete su animación!).

La forma más fácil de hacerlo es guardar temporalmente el registro en otro lugar (incluso una variable local), y luego volver a insertarlo si se presiona el botón de deshacer.


Si no desea eliminar el registro de la base de datos inmediatamente, intente esto:

// Backup the item for undo int itemIndex = viewHolder.getAdapterPosition(); Item item = adapter.getItem(itemIndex); // Delete only from the adapter adapter.removeItem(itemIndex); Snackbar.make(getView(), "Item deleted", LENGTH_LONG) .addCallback(new BaseCallback<Snackbar>() { public void onDismissed(Snackbar transientBottomBar, int event) { if (event != DISMISS_EVENT_ACTION) { // Dismiss wasn''t because of tapping "UNDO" // so here delete the item from databse } } }) .setAction("UNDO", v -> adapter.addItem(item, itemIndex)) .show();