Created
May 21, 2014 01:31
-
-
Save dinigo/7ab6afd0d01106733125 to your computer and use it in GitHub Desktop.
ListActivity ready for Context Actionbar multiselect
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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