/** * @return a set with the global positions of all expanded items */ public int[] getExpandedItems() { int[] expandedItems; ArrayList<Integer> expandedItemsList = new ArrayList<>(); Item item; for (int i = 0, size = mFastAdapter.getItemCount(); i < size; i++) { item = mFastAdapter.getItem(i); if (item instanceof IExpandable && ((IExpandable) item).isExpanded()) { expandedItemsList.add(i); } } int expandedItemsListLength = expandedItemsList.size(); expandedItems = new int[expandedItemsListLength]; for (int i = 0; i < expandedItemsListLength; i++) { expandedItems[i] = expandedItemsList.get(i); } return expandedItems; }
@Override public void notifyAdapterItemRangeChanged(int position, int itemCount, Object payload) { for (int i = position; i < position + itemCount; i++) { Item item = mFastAdapter.getItem(position); if (item instanceof IExpandable && ((IExpandable) item).isExpanded()) { collapse(position); } } }
/** * Gets all subItems from a given parent item * * @param item the parent from which we add all items * @param items the list in which we add the subItems */ public static <Item extends IItem> void addAllSubItems(Item item, List<Item> items) { if (item instanceof IExpandable && !((IExpandable) item).isExpanded() && ((IExpandable) item).getSubItems() != null) { List<Item> subItems = (List<Item>) ((IExpandable<Item, ?>) item).getSubItems(); Item subItem; for (int i = 0, size = subItems.size(); i < size; i++) { subItem = subItems.get(i); items.add(subItem); addAllSubItems(subItem, items); } } } }
@Override public void saveInstanceState(Bundle savedInstanceState, String prefix) { if (savedInstanceState == null) { return; } ArrayList<String> expandedItems = new ArrayList<>(); Item item; for (int i = 0, size = mFastAdapter.getItemCount(); i < size; i++) { item = mFastAdapter.getItem(i); if (item instanceof IExpandable && ((IExpandable) item).isExpanded()) { expandedItems.add(String.valueOf(item.getIdentifier())); } } //remember the collapsed states savedInstanceState.putStringArrayList(BUNDLE_EXPANDED + prefix, expandedItems); }
/** * internal method to restore the selection state of subItems * * @param item the parent item * @param selectedItems the list of selectedItems from the savedInstanceState */ public static <Item extends IItem> void restoreSubItemSelectionStatesForAlternativeStateManagement(Item item, List<String> selectedItems) { if (item instanceof IExpandable && !((IExpandable) item).isExpanded() && ((IExpandable) item).getSubItems() != null) { List<Item> subItems = (List<Item>) ((IExpandable<Item, ?>) item).getSubItems(); for (int i = 0, size = subItems.size(); i < size; i++) { Item subItem = subItems.get(i); String id = String.valueOf(subItem.getIdentifier()); if (selectedItems != null && selectedItems.contains(id)) { subItem.withSetSelected(true); } restoreSubItemSelectionStatesForAlternativeStateManagement(subItem, selectedItems); } } }
/** * internal method to find all selections from subItems and sub sub items so we can save those inside our savedInstanceState * * @param item the parent item * @param selections the ArrayList which will be stored in the savedInstanceState */ public static <Item extends IItem> void findSubItemSelections(Item item, List<String> selections) { if (item instanceof IExpandable && !((IExpandable) item).isExpanded() && ((IExpandable) item).getSubItems() != null) { List<Item> subItems = (List<Item>) ((IExpandable<Item, ?>) item).getSubItems(); for (int i = 0, size = subItems.size(); i < size; i++) { Item subItem = subItems.get(i); String id = String.valueOf(subItem.getIdentifier()); if (subItem.isSelected()) { selections.add(id); } findSubItemSelections(subItem, selections); } } }
/** * toggles the expanded state of the given expandable item at the given position * * @param position the global position */ public void toggleExpandable(int position) { Item item = mFastAdapter.getItem(position); if (item instanceof IExpandable && ((IExpandable) item).isExpanded()) { collapse(position); } else { expand(position); } }
/** * calculates the count of expandable items before a given position * * @param from the global start position you should pass here the count of items of the previous adapters (or 0 if you want to start from the beginning) * @param position the global position * @return the count of expandable items before a given position */ public int getExpandedItemsCount(int from, int position) { int totalAddedItems = 0; //first we find out how many items were added in total //also counting subItems Item tmp; for (int i = from; i < position; i++) { tmp = mFastAdapter.getItem(i); if (tmp instanceof IExpandable) { IExpandable tmpExpandable = ((IExpandable) tmp); if (tmpExpandable.getSubItems() != null && tmpExpandable.isExpanded()) { totalAddedItems = totalAddedItems + tmpExpandable.getSubItems().size(); } } } return totalAddedItems; }
/** * returns the expanded items this contains position and the count of items * which are expanded by this position * * @return the expanded items */ public SparseIntArray getExpanded() { SparseIntArray expandedItems = new SparseIntArray(); Item item; for (int i = 0, size = mFastAdapter.getItemCount(); i < size; i++) { item = mFastAdapter.getItem(i); if (item instanceof IExpandable && ((IExpandable) item).isExpanded()) { expandedItems.put(i, ((IExpandable) item).getSubItems().size()); } } return expandedItems; }
ArrayList<Integer> expandedItemsList = new ArrayList<>(); for (Object subItem : ((IExpandable) parent).getSubItems()) { if (subItem instanceof IExpandable && ((IExpandable) subItem).isExpanded() && subItem != item) { expandedItemsList.add(mFastAdapter.getPosition((Item) subItem));
int subItems = header.getSubItems().size(); int position = adapter.getPosition(header); boolean expanded = header.isExpanded(); if (header.isExpanded()) { for (int i = 0; i < subItems; i++) { item = (IItem) header.getSubItems().get(i);
if (parentPos != -1 && ((IExpandable) parent).isExpanded()) { expandableExtension.notifyAdapterSubItemsChanged(parentPos, ((IExpandable) parent).getSubItems().size() + 1); expanded = ((IExpandable) parent).isExpanded(); fastAdapter.notifyAdapterItemChanged(parentPos);
@Override public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, @NonNull Item item, int position) { //we do not care about non visible items if (position == -1) { return false; } //this is the entrance parent if (allowedParents.size() > 0 && item instanceof ISubItem) { // Go on until we hit an item with a parent which was not in our expandable hierarchy IItem parent = ((ISubItem) item).getParent(); if (parent == null || !allowedParents.contains(parent)) { return true; } } if (item instanceof IExpandable) { IExpandable expandable = (IExpandable) item; if (expandable.isExpanded()) { expandable.withIsExpanded(false); if (expandable.getSubItems() != null) { expandedItemsCount[0] += expandable.getSubItems().size(); allowedParents.add(item); } } } return false; } }, position, true);
if (parentPos != -1 && ((IExpandable) parent).isExpanded()) { expandableExtension.notifyAdapterSubItemsChanged(parentPos, ((IExpandable) parent).getSubItems().size() + 1); expanded = ((IExpandable) parent).isExpanded(); fastAdapter.notifyAdapterItemChanged(parentPos);
public static <Item extends IItem> Triple<Boolean, Item, Integer> recursiveSub(IAdapter<Item> lastParentAdapter, int lastParentPosition, IExpandable parent, AdapterPredicate<Item> predicate, boolean stopOnMatch) { if (!parent.isExpanded() && parent.getSubItems() != null) { for (int ii = 0; ii < parent.getSubItems().size(); ii++) { Item sub = (Item) parent.getSubItems().get(ii);
/** * opens the expandable item at the given position * * @param position the global position * @param notifyItemChanged true if we need to call notifyItemChanged. DEFAULT: false */ public void expand(int position, boolean notifyItemChanged) { Item item = mFastAdapter.getItem(position); if (item != null && item instanceof IExpandable) { IExpandable expandable = (IExpandable) item; //if this item is not already expanded and has sub items we go on if (!expandable.isExpanded() && expandable.getSubItems() != null && expandable.getSubItems().size() > 0) { IAdapter<Item> adapter = mFastAdapter.getAdapter(position); if (adapter != null && adapter instanceof IItemAdapter) { ((IItemAdapter<?, Item>) adapter).addInternal(position + 1, expandable.getSubItems()); } //remember that this item is now opened (not collapsed) expandable.withIsExpanded(true); //we need to notify to get the correct drawable if there is one showing the current state if (notifyItemChanged) { mFastAdapter.notifyItemChanged(position); } } } }
int subItems = header.getSubItems().size(); int position = adapter.getPosition(header); if (header.isExpanded()) { for (int i = 0; i < subItems; i++) { if (((IItem) header.getSubItems().get(i)).isSelectable()) {
/** * @param position the global position of the current item * @return a set with the global positions of all expanded items on the root level */ public int[] getExpandedItemsRootLevel(int position) { int[] expandedItems; ArraySet<Integer> expandedItemsList = new ArraySet<>(); Item item = mFastAdapter.getItem(position); for (int i = 0, size = mFastAdapter.getItemCount(); i < size; i++) { Item currItem = mFastAdapter.getItem(i); if (currItem instanceof ISubItem) { IItem parent = ((ISubItem) currItem).getParent(); if (parent instanceof IExpandable && ((IExpandable) parent).isExpanded()) { i += ((IExpandable) parent).getSubItems().size(); if (parent != item) expandedItemsList.add(mFastAdapter.getPosition((Item) parent)); } } } int expandedItemsListLength = expandedItemsList.size(); expandedItems = new int[expandedItemsListLength]; for (int i = 0; i < expandedItemsListLength; i++) { expandedItems[i] = expandedItemsList.valueAt(i); } return expandedItems; }
if (item instanceof IExpandable && !((IExpandable)item).isExpanded()) { SubItemUtil.selectAllSubItems(mFastAdapter, (T) mFastAdapter.getAdapterItem(i), select, true, mPayload);