private static Item getItem(Collection<? extends Group> groups, int position) { int count = 0; for (Group group : groups) { if (position < count + group.getItemCount()) { return group.getItem(position - count); } else { count += group.getItemCount(); } } throw new IndexOutOfBoundsException("Requested position " + position + "in group adapter " + "but there are only " + count + " items"); }
public int getAdapterPosition(@NonNull Item contentItem) { int count = 0; for (Group group : groups) { int index = group.getPosition(contentItem); if (index >= 0) return index + count; count += group.getItemCount(); } return -1; }
public void add(@NonNull Group group) { if (group == null) throw new RuntimeException("Group cannot be null"); int itemCountBeforeGroup = getItemCount(); group.registerGroupDataObserver(this); groups.add(group); notifyItemRangeInserted(itemCountBeforeGroup, group.getItemCount()); }
private int getPlaceholderItemCount() { if (isPlaceholderVisible && placeholder != null) { return placeholder.getItemCount(); } return 0; } }
private void remove(int position, @NonNull Group group) { int itemCountBeforeGroup = getItemCountBeforeGroup(position); group.unregisterGroupDataObserver(this); groups.remove(position); notifyItemRangeRemoved(itemCountBeforeGroup, group.getItemCount()); }
/** * Updates the adapter with a new list that will be diffed on the <em>main</em> thread * and displayed once diff results are calculated. Not recommended for huge lists. * @param newGroups List of {@link Group} */ @SuppressWarnings("unused") public void update(@NonNull final Collection<? extends Group> newGroups) { final List<Group> oldGroups = new ArrayList<>(groups); final int oldBodyItemCount = getItemCount(oldGroups); final int newBodyItemCount = getItemCount(newGroups); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff( new DiffCallback(oldBodyItemCount, newBodyItemCount, oldGroups, newGroups)); for (Group group : groups) { group.unregisterGroupDataObserver(this); } groups.clear(); groups.addAll(newGroups); for (Group group : newGroups) { group.registerGroupDataObserver(this); } diffResult.dispatchUpdatesTo(diffUtilCallbacks); }
@CallSuper public void addAll(@NonNull Collection<? extends Group> groups) { for (Group group : groups) { group.registerGroupDataObserver(this); } }
public void clear() { for (Group group : groups) { group.unregisterGroupDataObserver(this); } groups.clear(); notifyDataSetChanged(); }
@NonNull public Group getGroup(Item contentItem) { for (Group group : groups) { if (group.getPosition(contentItem) >= 0) { return group; } } throw new IndexOutOfBoundsException("Item is not present in adapter or in any group"); }
private static int getItemCount(Collection<? extends Group> groups) { int count = 0; for (Group group : groups) { count += group.getItemCount(); } return count; }
@CallSuper public void addAll(int position, @NonNull Collection<? extends Group> groups) { for (Group group : groups) { group.registerGroupDataObserver(this); } }
@CallSuper public void removeAll(@NonNull Collection<? extends Group> groups) { for (Group group : groups) { group.unregisterGroupDataObserver(this); } }
protected final int getItemCount(@NonNull Collection<? extends Group> groups) { int size = 0; for (Group group : groups) { size += group.getItemCount(); } return size; }
public void add(int index, @NonNull Group group) { if (group == null) throw new RuntimeException("Group cannot be null"); group.registerGroupDataObserver(this); groups.add(index, group); int itemCountBeforeGroup = getItemCountBeforeGroup(index); notifyItemRangeInserted(itemCountBeforeGroup, group.getItemCount()); }
private static Item getItem(Collection<? extends Group> groups, int position) { int previousPosition = 0; for (Group group : groups) { int size = group.getItemCount(); if (size + previousPosition > position) { return group.getItem(position - previousPosition); } previousPosition += size; } throw new IndexOutOfBoundsException("Wanted item at " + position + " but there are only " + previousPosition + " items"); }
/** * Gets the position of an * * @param item * @return */ public final int getPosition(@NonNull Item item) { int previousPosition = 0; for (int i = 0; i < getGroupCount(); i++) { Group group = getGroup(i); int position = group.getPosition(item); if (position >= 0) { return position + previousPosition; } previousPosition += group.getItemCount(); } return -1; }
@CallSuper public void add(@NonNull Group group) { group.registerGroupDataObserver(this); }
@CallSuper public void remove(@NonNull Group group) { group.unregisterGroupDataObserver(this); }
private int getItemCountBeforeGroup(int groupIndex) { int count = 0; for (Group group : groups.subList(0, groupIndex)) { count += group.getItemCount(); } return count; }
/** * Adds the contents of the list of groups, in order, to the end of the adapter contents. * All groups in the list must be non-null. * * @param groups */ public void addAll(@NonNull Collection<? extends Group> groups) { if (groups.contains(null)) throw new RuntimeException("List of groups can't contain null!"); int itemCountBeforeGroup = getItemCount(); int additionalSize = 0; for (Group group : groups) { additionalSize += group.getItemCount(); group.registerGroupDataObserver(this); } this.groups.addAll(groups); notifyItemRangeInserted(itemCountBeforeGroup, additionalSize); }