diff options
author | Matthew Wong <wongma@protonmail.ch> | 2015-07-01 01:49:02 -0400 |
---|---|---|
committer | Matthew Wong <wongma@protonmail.ch> | 2015-07-01 01:49:02 -0400 |
commit | 84b5da3ada3b3859153c8a8e709f5c7adc8a7bd0 (patch) | |
tree | 2ae2816c9e5196f39a1c989157cd8e2e3f5e07d0 | |
parent | 679d7f111e295d3a2b90ebafa8c4149d868bf30f (diff) |
Implement multi-select with actionbar
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/utils/PasswordRecyclerAdapter.java | 88 |
1 files changed, 73 insertions, 15 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRecyclerAdapter.java b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRecyclerAdapter.java index 2bcfd7ef..e72b9e07 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRecyclerAdapter.java +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRecyclerAdapter.java @@ -1,10 +1,14 @@ package com.zeapo.pwdstore.utils; import android.graphics.Color; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.view.ActionMode; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.util.Log; +import android.util.SparseBooleanArray; import android.view.LayoutInflater; +import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -20,6 +24,8 @@ public class PasswordRecyclerAdapter extends RecyclerView.Adapter<PasswordRecycl private final PasswordStore activity; private final ArrayList<PasswordItem> values; private final PasswordFragment.OnFragmentInteractionListener listener; + private final SparseBooleanArray selectedItems; + private ActionMode mActionMode; // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and @@ -44,6 +50,7 @@ public class PasswordRecyclerAdapter extends RecyclerView.Adapter<PasswordRecycl this.values = values; this.activity = activity; this.listener = listener; + selectedItems = new SparseBooleanArray(); } // Create new views (invoked by the layout manager) @@ -89,33 +96,74 @@ public class PasswordRecyclerAdapter extends RecyclerView.Adapter<PasswordRecycl holder.view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - listener.onFragmentInteraction(pass); + if (mActionMode != null) { + toggleSelection(holder.position); + } else { + listener.onFragmentInteraction(pass); + } } }); holder.view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { - PopupMenu p = new PopupMenu(activity, v); - p.getMenuInflater().inflate( - R.menu.context_pass, p.getMenu()); - p.show(); - p.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { - if (menuItem.getItemId() == R.id.menu_delete_password) { - activity.deletePassword(PasswordRecyclerAdapter.this, holder.position); - } - return false; - } - }); - return false; + if (mActionMode != null) { + return false; + } + toggleSelection(holder.position); + // Start the CAB using the ActionMode.Callback defined above + mActionMode = activity.startSupportActionMode(mActionModeCallback); + return true; } }); + holder.view.setSelected(selectedItems.get(position)); } + private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { + + // Called when the action mode is created; startActionMode() was called + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + // Inflate a menu resource providing context menu items + mode.getMenuInflater().inflate(R.menu.context_pass, menu); + return true; + } + + // Called each time the action mode is shown. Always called after onCreateActionMode, but + // may be called multiple times if the mode is invalidated. + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; // Return false if nothing is done + } + + // Called when the user selects a contextual menu item + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_delete_password: + for (int i = 0; i < selectedItems.size(); i++) { + if (selectedItems.valueAt(i)) { + activity.deletePassword(PasswordRecyclerAdapter.this, selectedItems.keyAt(i)); + } + } + mode.finish(); // Action picked, so close the CAB + return true; + default: + return false; + } + } + + // Called when the user exits the action mode + @Override + public void onDestroyActionMode(ActionMode mode) { + selectedItems.clear(); + mActionMode = null; + notifyDataSetChanged(); + } + }; + // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { @@ -146,4 +194,14 @@ public class PasswordRecyclerAdapter extends RecyclerView.Adapter<PasswordRecycl this.notifyItemRemoved(position); } + public void toggleSelection(int pos) { + if (selectedItems.get(pos, false)) { + selectedItems.delete(pos); + } + else { + selectedItems.put(pos, true); + } + notifyItemChanged(pos); + } + }
\ No newline at end of file |