package com.lateensoft.pathfinder.toolkit.views; import android.util.SparseBooleanArray; import android.view.*; import android.widget.ListView; import com.google.common.collect.Lists; import java.util.List; /** * @author tsiemens */ public abstract class MultiSelectActionModeCallback implements ActionMode.Callback { // Integrated checking/selection in ListView is not behaving as expected, so this is needed for now private SparseBooleanArray m_actionModeSelections; private int m_menuResId; public MultiSelectActionModeCallback(int menuResId) { m_actionModeSelections = new SparseBooleanArray(); m_menuResId = menuResId; } public boolean isListItemSelected(int position) { return m_actionModeSelections != null && m_actionModeSelections.get(position); } public void selectListItem(int position, boolean select) { m_actionModeSelections.put(position, select); getListView().invalidateViews(); } public void toggleListItemSelection(int position) { m_actionModeSelections.put(position, !m_actionModeSelections.get(position)); getListView().invalidateViews(); } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(m_menuResId, 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 exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { m_actionModeSelections = null; getListView().invalidateViews(); } /** @param listItems the items which are being represented in the listView * @return items which are currently selected **/ public <T> List<T> getSelectedItems(List<T> listItems) { List<T> selectedItems = Lists.newArrayListWithCapacity(m_actionModeSelections.size()); for (int i = 0; i < m_actionModeSelections.size(); i++) { int key = m_actionModeSelections.keyAt(i); if (m_actionModeSelections.get(key)) { selectedItems.add(listItems.get(key)); } } return selectedItems; } public abstract ListView getListView(); }