J'ai mis en place un snackbar dans mon application qui a un bouton Annuler pour annuler la suppression. Actuellement, comment ça marche, quand l'utilisateur supprime un élément, je garde un curseur avec l'élément en effectuant une requête depuis la base de données, l'élément est ensuite supprimé de la base de données et la liste est mise à jour via notifyChange()
. Lorsque l'utilisateur tape sur le bouton Annuler sur le snack, j'extrais le contenu du curseur sauvegardé, crée un nouveau ContentValue et l'insère dans la base de données, en appelant à nouveau notifyChange()
pour mettre à jour la liste.
Je n'aime pas cette approche. Il y a un trop de fonctionnement de la base de données.
Est-il possible que je peux supprimer/masquer un élément de la ListView et seulement supprimer l'élément lorsque le snackbar disparaît?
J'ai essayé le réglage de la visibilité à GONE ou INVISIBLE mais qui laisse un espace vide au milieu de la ListView.
J'utilise un CursorAdapter pour remplir le ListView. Il y a un menu 3 points sur chaque élément de liste qui montre une option de suppression.
Voici mon code actuel CursorAdapterComment supprimer un élément d'un ListView sans le supprimer de la base de données?
public class ProductCursorAdapter extends CursorAdapter {
private static final String LOG_TAG = ProductCursorAdapter.class.getSimpleName();
protected ContentResolver contentResolver;
public ProductCursorAdapter(Context context, Cursor c, ContentResolver contentResolver) {
super(context, c);
this.contentResolver = contentResolver;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
TextView name = (TextView) view.findViewById(R.id.name);
TextView quantity = (TextView) view.findViewById(R.id.quantity);
TextView price = (TextView) view.findViewById(R.id.price);
TextView supplier = (TextView) view.findViewById(R.id.supplier);
final long id = cursor.getLong(cursor.getColumnIndexOrThrow(ProductEntry._ID));
ImageView threeDotMenu = (ImageView) view.findViewById(R.id.three_dot_menu);
threeDotMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popup = new PopupMenu(context, v);
popup.getMenuInflater().inflate(R.menu.list_item_context_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.context_delete_product:
//the uri of the product we're deleting
Uri currentProductUri = ContentUris.withAppendedId(ProductEntry.CONTENT_URI, id);
//What to extract from the database
String[] projection = {
ProductEntry._ID,
ProductEntry.COLUMN_NAME,
ProductEntry.COLUMN_QUANTITY,
ProductEntry.COLUMN_PRICE,
ProductEntry.COLUMN_SUPPLIER,
ProductEntry.COLUMN_IMAGE
};
//retrieve the product from the database before deleting in case
//we need to restore it later
Cursor cursor = contentResolver.query(currentProductUri,
projection,
null,
null,
null,
null);
cursor.moveToFirst();
Snackbar snackbar = Snackbar.make(view.getRootView().findViewById(R.id.coordinator_layout), "Product Deleted", Snackbar.LENGTH_LONG);
snackbar.setAction("Undo", new MyUndoListener(cursor));
snackbar.show();
contentResolver.delete(currentProductUri, null, null);
return true;
default:
return false;
}
}
});
popup.show();
}
});
. . .
}
public class MyUndoListener implements View.OnClickListener {
Cursor cursor = null;
public MyUndoListener(Cursor cursor) {
this.cursor = cursor;
}
@Override
public void onClick(View v) {
contentResolver.insert(ProductEntry.CONTENT_URI, extractFromCursor(cursor));
}
private ContentValues extractFromCursor(Cursor cursor) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(ProductEntry._ID));
String name = cursor.getString(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_NAME));
int quantity = cursor.getInt(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_QUANTITY));
int price = cursor.getInt(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_PRICE));
String supplier = cursor.getString(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_SUPPLIER));
byte[] image = cursor.getBlob(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_IMAGE));
ContentValues value = new ContentValues();
value.put(ProductEntry._ID, id);
value.put(ProductEntry.COLUMN_NAME, name);
value.put(ProductEntry.COLUMN_PRICE, price);
value.put(ProductEntry.COLUMN_QUANTITY, quantity);
value.put(ProductEntry.COLUMN_SUPPLIER, supplier);
value.put(ProductEntry.COLUMN_IMAGE, image);
cursor.close();
return value;
}
}
}
ajouter une colonne d'un type booléen nommé « supprimé » dans le tableau et mettre vrai si supprimé autrement faux et afficher uniquement les enregistrement dont la valeur supprimée est fausse. –