Skip to content

Instantly share code, notes, and snippets.

@dinigo
Created May 21, 2014 01:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dinigo/7ab6afd0d01106733125 to your computer and use it in GitHub Desktop.
Save dinigo/7ab6afd0d01106733125 to your computer and use it in GitHub Desktop.
ListActivity ready for Context Actionbar multiselect
package es.daniel.notes;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
public class SelectableArrayListActivity<T> extends ListActivity {
private SelectionAdapter mAdapter;
private int rowLayout;
private Bundle savedInstanceState;
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.context_delete:
mAdapter.removeSelected();
mode.finish();
}
return false;
}
public void onCreate(Bundle savedInstanceState, int listLayout, int rowLayout) {
this.savedInstanceState = savedInstanceState;
this.rowLayout = rowLayout;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
onCreate();
super.onCreate(savedInstanceState);
mAdapter = new SelectionAdapter(this, rowLayout);
setListAdapter(mAdapter);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mAdapter.clearSelection();
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return onActionItemClicked(mode, item);
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
if (checked) {
mAdapter.addSelection(position);
} else {
mAdapter.removeSelection(position);
}
mode.setTitle(getString(R.string.context_title) + mAdapter.getNumSelected());
}
});
getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
getListView().setItemChecked(position, !mAdapter.isPositionChecked(position));
return false;
}
});
}
private class SelectionAdapter extends ArrayAdapter<T> {
private HashMap<T, Integer> mIdMap = new HashMap<T, Integer>();
private List<Integer> mSelection = new ArrayList<Integer>();
private int id = 0;
public SelectionAdapter(Context context, int rowLayout) {
super(context, rowLayout);
}
@Override
public void add(T object) {
super.add(object);
mIdMap.put(object, id++);
}
@Override
public void addAll(Collection<? extends T> collection) {
for (T object : collection) {
add(object);
}
}
@Override
public void remove(T object) {
super.remove(object);
removeSelection(getPosition(object));
mIdMap.remove(object);
}
@Override
public long getItemId(int position) {
T item = getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
public void addSelection(int position) {
mSelection.add(position);
notifyDataSetChanged();
}
public boolean isPositionChecked(int position) {
return mSelection.contains(position);
}
public List<T> getChecked() {
List<T> elements = new ArrayList<T>();
for (int position : mSelection) {
elements.add(getItem(position));
}
return elements;
}
public int getNumSelected() {
return mSelection.size();
}
public void removeSelection(int position) {
mSelection.remove(position);
}
public void clearSelection() {
mSelection = new ArrayList<Integer>();
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);//let the adapter handle setting up the row views
v.setBackgroundColor(getResources().getColor(android.R.color.background_light)); //default color
if (mSelection.get(position) != null) {
v.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));// this is a selected position so make it red
}
return v;
}
public void removeSelected() {
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment