2017-07-07 4 views
0

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; 

    } 

} 

}

+1

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. –

Répondre

0

bien Nishan, Pour ce faire Arraylist des valeurs de base de données, puis associez un listview. chaque fois que vous voulez supprimer un élément (pas de votre base de données), faites une copie de l'arraylist sans cet élément et liez de nouveau la listview.

Ainsi vous avez votre base de données reste la même et vous pouvez l'utiliser à nouveau en cas d'annulation. Donc quel élément vous voulez supprimer, lier un nouvel arraylist d'orignal arraylst sans cet élément et l'utiliser.

+0

'CursorAdapter' ne fonctionne pas de cette façon. Il repose sur le curseur de la base de données au lieu d'une liste. – Joshua