2017-07-07 6 views
0

私は、削除を取り消す元に戻すボタンがある私のアプリでスナックバーを実装しました。現在の動作は、ユーザーがアイテムを削除すると、データベースからクエリを実行してアイテムにカーソルを置き、アイテムをデータベースから削除し、リストをnotifyChange()で更新します。ユーザーがスナックバーの[元に戻す]ボタンをタップすると、保存されているカーソルからコンテンツを抽出し、新しいContentValueを作成してデータベースに挿入し、再びnotifyChange()を呼び出してリストを更新します。
私はこのアプローチが嫌いです。 1つのデータベース操作が多すぎます。
ListViewから項目を削除/非表示にする方法はありますか?スナップバーが消えた場合にのみ項目を削除しますか?
可視性をGONEまたはINVISIBLEに設定しようとしましたが、ListViewの途中に空白が残ります。
CursorAdapterを使用してListViewにデータを設定しています。各リスト項目には、削除オプションを示す3ドットのメニューがあります。
は、ここでデータベース値のこのメイクのArrayListのために私の現在のCursorAdapterコードアイテムをデータベースから削除せずにリストビューから削除するにはどうすればよいですか?

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

テーブルに "deleted"という名前のブール型の1つの列を追加し、削除された場合はtrueを、そうでない場合はfalseを返し、削除された値がfalseのレコードのみを表示します。 –

答えて

0

まあニシャン、で、その後、リストビューをバインドします。 1つのアイテム(データベースではない)を削除したいときはいつでも、そのアイテムなしでarraylistのコピーを作成し、再度リストビューをバインドします。

このように、データベースは同じままです。元に戻す場合は、もう一度使用できます。 それで、どのアイテムを削除したいのですか?そのアイテムのないarriylstから新しいarraylistをバインドして使用してください。

+0

'CursorAdapter'はそのようには機能しません。それはリストの代わりにデータベースのカーソルに依存します。 – Joshua

関連する問題