私は、削除を取り消す元に戻すボタンがある私のアプリでスナックバーを実装しました。現在の動作は、ユーザーがアイテムを削除すると、データベースからクエリを実行してアイテムにカーソルを置き、アイテムをデータベースから削除し、リストを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;
}
}
}
テーブルに "deleted"という名前のブール型の1つの列を追加し、削除された場合はtrueを、そうでない場合はfalseを返し、削除された値がfalseのレコードのみを表示します。 –