Back to project page ShareList-Android.
The source code is released under:
GNU General Public License
If you think the Android project ShareList-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package org.mybop.sharelist.app.view.support; // w ww .j a v a2 s.c o m import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.support.v7.view.ActionMode; import android.util.SparseBooleanArray; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Checkable; import android.widget.ListAdapter; import android.widget.ListView; import org.mybop.sharelist.app.R; import org.mybop.sharelist.app.util.ArrayUtil; public abstract class ListFragment extends Fragment { public interface OnItemDeletionListener { void onItemDeletion(Object[] selectedItems); } public interface OnItemSelectionListener { public void onItemSelection(Object selectedItem); } private ListView listView; private View emptyList; private ListAdapter adapter; private OnItemDeletionListener deletionListener; private OnItemSelectionListener selectionListener; private ActionMode actionMode = null; protected boolean selected = false; protected long[] selectedIds = new long[0]; private boolean viewInitialized = false; private boolean dataInitialized = false; private ActionMode.Callback actionModeCallback = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { MenuInflater inflater = actionMode.getMenuInflater(); inflater.inflate(R.menu.rowselection, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { if (R.id.action_delete_selection == menuItem.getItemId()) { if (deletionListener != null) { Object[] selectedItems = new Object[selectedIds.length]; for (int i = 0, j = 0; i < listView.getAdapter().getCount(); i++) { if (ArrayUtil.contains(selectedIds, listView.getAdapter().getItemId(i))) { selectedItems[j] = listView.getAdapter().getItem(i); j++; } } deletionListener.onItemDeletion(selectedItems); } actionMode.finish(); return true; } return false; } // called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode actionMode) { selected = false; ListFragment.this.actionMode = null; SparseBooleanArray positions = listView.getCheckedItemPositions(); assert positions != null; int itemCount = listView.getCount(); for (int i = 0; i < itemCount; i++) { if (positions.get(i)) { listView.setItemChecked(i, false); } } int childCount = listView.getChildCount(); for (int i = 0; i < childCount; i++) { View child = listView.getChildAt(i); if (child instanceof Checkable) { ((Checkable) child).setChecked(false); } } listView.setChoiceMode(AbsListView.CHOICE_MODE_NONE); } }; @Override public void onSaveInstanceState(Bundle outState) { outState.putBoolean("selected", selected); outState.putLongArray("selectedIds", selectedIds); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); listView = (ListView) getView().findViewById(R.id.listView); assert listView != null; emptyList = getView().findViewById(R.id.listEmpty); assert emptyList != null; listView.setEmptyView(emptyList); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (actionMode != null) { selectedIds = listView.getCheckedItemIds(); int selectedCount = selectedIds.length; if (selectedCount > 0) { actionMode.setTitle(Integer.toString(selectedCount)); } else { actionMode.finish(); } } else { if (selectionListener != null) { selectionListener.onItemSelection(adapter.getItem(position)); } } } }); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if (actionMode != null) { return false; } listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); listView.setItemChecked(position, true); actionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(actionModeCallback); actionMode.setTitle("1"); selected = true; selectedIds = listView.getCheckedItemIds(); return true; } }); if (savedInstanceState != null) { selected = savedInstanceState.getBoolean("selected"); selectedIds = savedInstanceState.getLongArray("selectedIds"); } viewInitialized = true; restoreState(); } private void restoreState() { if (!viewInitialized || !dataInitialized) return; listView.setAdapter(adapter); if (selected) { listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); for (int i = 0; i < adapter.getCount(); i++) { if (ArrayUtil.contains(selectedIds, adapter.getItemId(i))) { listView.setItemChecked(i, true); } } actionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(actionModeCallback); actionMode.setTitle(Integer.toString(selectedIds.length)); } } public void setAdapter(ListAdapter adapter) { if (!adapter.hasStableIds()) { throw new IllegalStateException("the adapter must have stable ids to support deletion"); } this.adapter = adapter; dataInitialized = true; restoreState(); } public void setOnItemDeletionListener(OnItemDeletionListener deletionListener) { this.deletionListener = deletionListener; } public void setOnItemSelectionListener(OnItemSelectionListener selectionListener) { this.selectionListener = selectionListener; } public ListView getListView() { return listView; } public View getEmptyList() { return emptyList; } public ListAdapter getAdapter() { return adapter; } }