Skip to content

Instantly share code, notes, and snippets.

@maydin
Created March 3, 2017 15:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maydin/2e0daa3dc194f651dd7d07ffd9ee6716 to your computer and use it in GitHub Desktop.
Save maydin/2e0daa3dc194f651dd7d07ffd9ee6716 to your computer and use it in GitHub Desktop.
SelectableAdapter
public class SelectableAdapter extends RecyclerView.Adapter implements SelectableViewHolder.OnItemSelectedListener {
private final List<SelectableItem> mValues;
private boolean isMultiSelectionEnabled = false;
SelectableViewHolder.OnItemSelectedListener listener;
public SelectableAdapter( SelectableViewHolder.OnItemSelectedListener listener,
List<Item> items,boolean isMultiSelectionEnabled) {
this.listener = listener;
this.isMultiSelectionEnabled = isMultiSelectionEnabled;
mValues = new ArrayList<>();
for (Item item : items) {
mValues.add(new SelectableItem(item, false));
}
}
@Override
public SelectableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.checked_item, parent, false);
return new SelectableViewHolder(itemView, this);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
SelectableViewHolder holder = (SelectableViewHolder) viewHolder;
SelectableItem selectableItem = mValues.get(position);
String name = selectableItem.getName();
holder.textView.setText(name);
if (isMultiSelectionEnabled) {
TypedValue value = new TypedValue();
holder.textView.getContext().getTheme().resolveAttribute(android.R.attr.listChoiceIndicatorMultiple, value, true);
int checkMarkDrawableResId = value.resourceId;
holder.textView.setCheckMarkDrawable(checkMarkDrawableResId);
} else {
TypedValue value = new TypedValue();
holder.textView.getContext().getTheme().resolveAttribute(android.R.attr.listChoiceIndicatorSingle, value, true);
int checkMarkDrawableResId = value.resourceId;
holder.textView.setCheckMarkDrawable(checkMarkDrawableResId);
}
holder.mItem = selectableItem;
holder.setChecked(holder.mItem.isSelected());
}
@Override
public int getItemCount() {
return mValues.size();
}
public List<Item> getSelectedItems() {
List<Item> selectedItems = new ArrayList<>();
for (SelectableItem item : mValues) {
if (item.isSelected()) {
selectedItems.add(item);
}
}
return selectedItems;
}
@Override
public int getItemViewType(int position) {
if(isMultiSelectionEnabled){
return SelectableViewHolder.MULTI_SELECTION;
}
else{
return SelectableViewHolder.SINGLE_SELECTION;
}
}
@Override
public void onItemSelected(SelectableItem item) {
if (!isMultiSelectionEnabled) {
for (SelectableItem selectableItem : mValues) {
if (!selectableItem.equals(item)
&& selectableItem.isSelected()) {
selectableItem.setSelected(false);
} else if (selectableItem.equals(item)
&& item.isSelected()) {
selectableItem.setSelected(true);
}
}
notifyDataSetChanged();
}
listener.onItemSelected(item);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment