/** * Overloaded version of update method in which you can pass your own DiffUtil.DiffResult * @param newBodyGroups The new content of the section * @param diffResult */ public void update(@NonNull final Collection<? extends Group> newBodyGroups, DiffUtil.DiffResult diffResult) { super.removeAll(children); children.clear(); children.addAll(newBodyGroups); super.addAll(newBodyGroups); diffResult.dispatchUpdatesTo(listUpdateCallback); refreshEmptyState(); }
@NonNull public Item getItem(int position) { int previousPosition = 0; for (int i = 0; i < getGroupCount(); i++) { Group group = getGroup(i); 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 " + getItemCount() + " items"); }
protected int getItemCountBeforeGroup(@NonNull final Group group) { final int groupIndex = getPosition(group); return getItemCountBeforeGroup(groupIndex); }
public int getItemCount() { int size = 0; for (int i = 0; i < getGroupCount(); i++) { Group group = getGroup(i); size += group.getItemCount(); } return size; }
@CallSuper @Override public void onItemInserted(@NonNull Group group, int position) { observable.onItemInserted(this, getItemCountBeforeGroup(group) + position); }
@Override public void addAll(@NonNull Collection<? extends Group> groups) { if (groups.isEmpty()) { return; } super.addAll(groups); if (isExpanded) { int itemCount = getItemCount(); this.children.addAll(groups); notifyItemRangeInserted(itemCount, getItemCount(groups)); } else { this.children.addAll(groups); } }
@Override public void add(@NonNull Group group) { super.add(group); if (isExpanded) { int itemCount = getItemCount(); children.add(group); notifyItemRangeInserted(itemCount, group.getItemCount()); } else { children.add(group); } }
@Override public void onItemInserted(@NonNull Group group, int position) { if (dispatchChildChanges(group)) { super.onItemInserted(group, position); } }
@Override public void onItemChanged(@NonNull Group group, int position) { if (dispatchChildChanges(group)) { super.onItemChanged(group, position); } }
@Override public void onChanged(@NonNull Group group) { if (dispatchChildChanges(group)) { super.onChanged(group); } }
protected int getItemCountBeforeGroup(final int groupIndex) { int size = 0; for (int i = 0; i < groupIndex; i++) { final Group currentGroup = getGroup(i); size += currentGroup.getItemCount(); } return size; }
@CallSuper @Override public void onItemChanged(@NonNull Group group, int position, Object payload) { observable.onItemChanged(this, getItemCountBeforeGroup(group) + position, payload); }
/** * 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; }
@Override public void addAll(int position, @NonNull Collection<? extends Group> groups) { if (groups.isEmpty()) { return; } super.addAll(position, groups); if (isExpanded) { int itemCount = getItemCount(); this.children.addAll(position, groups); notifyItemRangeInserted(itemCount, getItemCount(groups)); } else { this.children.addAll(position, groups); } }
@Override public void add(@NonNull Group group) { super.add(group); int position = getItemCountWithoutFooter(); children.add(group); notifyItemRangeInserted(position, group.getItemCount()); refreshEmptyState(); }
@Override public void onItemInserted(@NonNull Group group, int position) { super.onItemInserted(group, position); refreshEmptyState(); }
@Override public void onItemChanged(@NonNull Group group, int position, Object payload) { if (dispatchChildChanges(group)) { super.onItemChanged(group, position, payload); } }
@CallSuper @Override public void onItemRangeRemoved(@NonNull Group group, int positionStart, int itemCount) { observable.onItemRangeRemoved(this, getItemCountBeforeGroup(group) + positionStart, itemCount); }
@Override public void addAll(@NonNull Collection<? extends Group> groups) { if (groups.isEmpty()) return; super.addAll(groups); int position = getItemCountWithoutFooter(); this.children.addAll(groups); notifyItemRangeInserted(position, getItemCount(groups)); refreshEmptyState(); }