@Override public boolean areItemsTheSame(Item oldItem, Item newItem) { return oldItem.getIdentifier() == newItem.getIdentifier(); }
@Override public boolean apply(@NonNull IAdapter lastParentAdapter, int lastParentPosition, @NonNull IItem item, int position) { return item.getIdentifier() == identifier; } }, true);
@Override public int getAdapterPosition(long identifier) { for (int i = 0, size = mItems.size(); i < size; i++) { if (mItems.get(i).getIdentifier() == identifier) { return i; } } return -1; }
/** * Searches for the given identifier and calculates its relative position * * @param identifier the identifier of an item which is searched for * @return the relative position */ public int getAdapterPosition(long identifier) { for (int i = 0, size = mOriginalItems.size(); i < size; i++) { if (mOriginalItems.get(i).getIdentifier() == identifier) { return i; } } return -1; }
/** * Searches for the given item and calculates its global position * * @param item the item which is searched for * @return the global position, or -1 if not found */ public int getPosition(Item item) { if (item.getIdentifier() == -1) { Log.e("FastAdapter", "You have to define an identifier for your item to retrieve the position via this method"); return -1; } return getPosition(item.getIdentifier()); }
/** * finds the int ItemId from the IItem which exists at the given position * * @param position the global position * @return the itemId for this position */ @Override public long getItemId(int position) { return getItem(position).getIdentifier(); }
/** * Searches for the given item and calculates its relative position * * @param item the item which is searched for * @return the relative position */ @Override public int getAdapterPosition(Item item) { return getAdapterPosition(item.getIdentifier()); }
@Override public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, Item item, int position) { if (identifiers.contains(item.getIdentifier())) { select(lastParentAdapter, item, position, fireEvent, considerSelectableFlag); } return false; } }, false);
@Override public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, Item item, int position) { if (item.getIdentifier() == identifier) { select(lastParentAdapter, item, position, fireEvent, considerSelectableFlag); return true; } return false; } }, true);
@Override public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, Item item, int position) { if (identifiers.contains(item.getIdentifier())) { deselect(item, position, null); } return false; } }, false);
@Override public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, Item item, int position) { if (item.getIdentifier() == identifier) { deselect(item, position, null); return true; } return false; } }, true);
/** * Searches for the given item and calculates its relative position * * @param item the item which is searched for * @return the relative position */ public int getAdapterPosition(Item item) { return getAdapterPosition(item.getIdentifier()); }
@Override public void saveInstanceState(@Nullable Bundle savedInstanceState, String prefix) { if (savedInstanceState == null) { return; } Set<Item> selections = mFastAdapter.getSelectedItems(); long[] selectionsArray = new long[selections.size()]; int i = 0; for (Item item : selections) { selectionsArray[i] = item.getIdentifier(); i++; } //remember the selections savedInstanceState.putLongArray(BUNDLE_SELECTIONS + prefix, selectionsArray); }
@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); }
@Override public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, Item item, int position) { if (identifier == item.getIdentifier()) { //if it's a subitem remove it from the parent if (item instanceof ISubItem) { //a sub item which is not in the list can be instantly deleted IExpandable parent = (IExpandable) ((ISubItem) item).getParent(); //parent should not be null, but check in any case.. if (parent != null) { parent.getSubItems().remove(item); } } if (position != -1) { //a normal displayed item can only be deleted afterwards remove(position); } } return false; } }, false);
/** * 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); } } }
@Override public void withSavedInstanceState(@Nullable Bundle savedInstanceState, String prefix) { if (savedInstanceState == null) { return; } ArrayList<String> expandedItems = savedInstanceState.getStringArrayList(BUNDLE_EXPANDED + prefix); String id; for (int i = 0, size = mFastAdapter.getItemCount(); i < size; i++) { Item item = mFastAdapter.getItem(i); id = String.valueOf(item.getIdentifier()); if (expandedItems != null && expandedItems.contains(id)) { expand(i); size = mFastAdapter.getItemCount(); } } }
/** * notifies items (incl. sub items if they are currently extended) * * @param adapter the adapter * @param identifiers set of identifiers that should be notified * @param restoreExpandedState true, if expanded headers should stay expanded */ public static <Item extends IItem & IExpandable> void notifyItemsChanged(final FastAdapter adapter, ExpandableExtension expandableExtension, Set<Long> identifiers, boolean restoreExpandedState) { int i; IItem item; for (i = 0; i < adapter.getItemCount(); i++) { item = adapter.getItem(i); if (item instanceof IExpandable) { notifyItemsChanged(adapter, expandableExtension, (Item) item, identifiers, true, restoreExpandedState); } else if (identifiers.contains(item.getIdentifier())) { adapter.notifyAdapterItemChanged(i); } } }
/** * overwrite the getItemId to correctly return the value from the FastAdapter * * @param position * @return */ @Override public long getItemId(int position) { if (shouldInsertItemAtPosition(position)) { return getItem(position).getIdentifier(); } else { return mAdapter.getItemId(position - itemInsertedBeforeCount(position)); } }