package com.hci.moola.view; import android.content.Context; import com.hci.moola.model.ObservableSortedList; import java.util.Arrays; import java.util.List; public abstract class ExpandableMultiSelectAdapter<T extends Comparable<? super T>> extends StableAdapter<ExpandableListItem<T>> implements ObservableSortedList.ObservableListListener<T> { private boolean[] mCheckedItems; private int mCheckedItemCount; private boolean mIsEditModeEnabled; public ExpandableMultiSelectAdapter(Context context, ObservableSortedList<T> items) { super(context, buildExpandableListItems(items)); items.setObservableListListener(this); mCheckedItems = new boolean[items.size() + 4]; mCheckedItemCount = 0; mIsEditModeEnabled = false; } /** * T list items has been updated. We got to mirror this in our List of ExpandableListItems */ @Override public void onAdd(T itemAdded) { super.add(new ExpandableListItem<T>(itemAdded)); } @Override public void onRemove(T itemRemoved) { super.remove(new ExpandableListItem<T>(itemRemoved)); } @Override public void onSet(int index, T oldItem, T newItem) { super.set(index, new ExpandableListItem<T>(newItem)); } private static <T extends Comparable<? super T>> List<ExpandableListItem<T>> buildExpandableListItems(ObservableSortedList<T> items) { ObservableSortedList<ExpandableListItem<T>> listItems = new ObservableSortedList<ExpandableListItem<T>>(); for (T t : items) listItems.add(new ExpandableListItem<T>(t)); return listItems; } public boolean isEditModeEnabled() { return mIsEditModeEnabled; } public int[] getCheckedIndicies() { int[] vals = new int[mCheckedItemCount]; int count = 0; for (int i = 0; i < mCheckedItems.length; i++) { if (mCheckedItems[i]) vals[count++] = i; } return vals; } public int getCheckedCount() { return mCheckedItemCount; } public void setEditModeEnabled(boolean isEdit) { if (!isEdit) { for (int i = 0; i < mCheckedItems.length; i++) mCheckedItems[i] = false; mCheckedItemCount = 0; } mIsEditModeEnabled = isEdit; } @Override public void notifyDataSetChanged() { if (mCheckedItems.length < getCount()) mCheckedItems = Arrays.copyOf(mCheckedItems, getCount() + 4); super.notifyDataSetChanged(); } public void toggleChecked(int index) { if (index < 0) return; if (mCheckedItems[index] = !mCheckedItems[index]) mCheckedItemCount++; else mCheckedItemCount--; } protected boolean isChecked(int index) { return mCheckedItems[index]; } }