22

私は Android で Snackbar を使用しており、ユーザーがアクションを元に戻すことができるようにアクションを実装しました (アクションはリストビュー内のすべてのアイテムをクリアしています)。リストビューへのアイテムの削除と追加は既に行われており、正常に動作しています。

私の問題は、アイテムがsqliteデータベースに保存されていることです。テーブルからアイテムを削除するにはどうすればよいですか? (データベースからデータを完全に削除できるように、ユーザーが元に戻すボタンをクリックしていないことをどのように知ることができますか)。

これはOnOptionsItemSelected()内のコードです

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;

そのため、ユーザーがスナックバーの表示期間中に元に戻すボタンをクリックしなかった場合、データベースからデータを完全に削除する必要があります。

これに対する解決策はありますか?

4

5 に答える 5

31

私の知る限り、それは設計によるものです。あなたがすべき:

  • ユーザーが削除ボタンをタップするとすぐにアイテムを削除します。
  • クラス変数に一時的に格納します。
  • ユーザーが [元に戻す] をタップすると、アイテムがデータベースに再度追加されます。

このアプローチはより安全で堅牢です。スナックバーが閉じられるのを待つべきではありません。スナックバーがまだオンになっているときにユーザーがアプリを強制終了することを考えてみてください。アイテムを削除する必要がありますか? そうすべき。

より信頼できる情報源は、Ian Lake による g+ の投稿です (G+ の廃止により削除されました)。コメントで読むことができます:

UI をすぐに反応させたい (スナックバーが消えるのを待たない) - ほとんどのシステム (特に外部サーバーと同期するシステム) には、削除済みとしてマークされる「ソフト削除」の概念があります。そのような場合、元に戻すアクションは、レコードの削除済みマークを解除するだけです。このシステムは、スナックバーが終了する前にユーザーがアプリを離れた場合でも機能します (スナックバーが常にアニメーションを完了するとは限りません!)。

これを行う最も簡単な方法は、レコードを一時的に別の場所 (ローカル変数であっても) に保存し、[元に戻す] ボタンが押された場合に再挿入することです。

于 2015-06-25T18:24:34.467 に答える
11

Android サポート ライブラリ v23 に追加されたSnackbar.Callbackを使用して、ユーザーまたはタイムアウトによって Snackbar が閉じられた場合にリッスンできます。

astinxの投稿から借用した例:

Snackbar.make(getView(), "Hi there!", Snackbar.LENGTH_LONG).setCallback( new Snackbar.Callback() {
            @Override
            public void onDismissed(Snackbar snackbar, int event) {
                switch(event) {
                    case Snackbar.Callback.DISMISS_EVENT_ACTION:
                        Toast.makeText(getActivity(), "Clicked the action", Toast.LENGTH_LONG).show();
                        break;
                    case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
                        Toast.makeText(getActivity(), "Time out", Toast.LENGTH_LONG).show();
                        break;
                }
            }

            @Override
            public void onShown(Snackbar snackbar) {
                Toast.makeText(getActivity(), "This is my annoying step-brother", Toast.LENGTH_LONG).show();
            }
        }).setAction("Go away!", new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        }).show();
于 2015-10-18T09:36:03.147 に答える