私は Android で Snackbar を使用しており、ユーザーがアクションを元に戻せるようにアクションを実装しました (アクションはリストビュー内のすべての項目をクリアします)。項目を削除してリストビューに戻す操作はすでに実行されており、正常に動作しています。
私の問題は、アイテムが sqlite データベースに保存されており、テーブルからアイテムを削除するにはどうすればよいかということです。(ユーザーが元に戻すボタンをクリックしていないことをどのように確認すれば、データベースからデータを完全に削除できますか)。
これが内部のコードですオプション項目が選択された場合()
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;
したがって、スナックバーの表示期間中にユーザーが元に戻すボタンをクリックしなかった場合は、データベースからデータを完全に削除する必要があります。
これに対する解決策はありますか?
ベストアンサー1
私の知る限り、これは設計によるものです。次のことを行ってください。
- ユーザーが削除ボタンをタップするとすぐにアイテムを削除します。
- クラス変数に一時的に保存します。
- ユーザーが「元に戻す」をタップした場合、アイテムをデータベースに再度追加します。
このアプローチはより安全で堅牢です。スナックバーが閉じられるのを待つべきではありません。そのアクションは発生しない可能性があるからです。スナックバーがまだ表示されているときにユーザーがアプリを強制終了した場合を考えてみましょう。その項目は削除されるべきでしょうか。削除すべきです。
より信頼できる情報源は、Ian Lake による g+ の投稿です (G+ の廃止により削除されました)。コメントには次のように書かれています:
UI がすぐに反応するようにしたい場合 (スナックバーが消えるのを待たずに) - ほとんどのシステム (特に外部サーバーと同期するもの) には、削除済みとしてマークされる「ソフト削除」の概念があります。このような場合、元に戻すアクションは、レコードの削除済みマークを解除するだけです。このシステムは、スナックバーが終了する前にユーザーがアプリを離れた場合でも機能します (スナックバーが常にアニメーションを完了するとは限らないため)。
最も簡単な方法は、レコードを一時的に別の場所(ローカル変数でも可)に保存し、元に戻すボタンが押された場合に再度挿入することです。