@SuppressWarnings("unchecked") @Override public SwipeResultAction onSwipeItem(@NonNull RecyclerView.ViewHolder holder, int position, int result) { if (!(mExpandableItemAdapter instanceof BaseExpandableSwipeableItemAdapter)) { return null; } if (position == RecyclerView.NO_POSITION) { return null; } final BaseExpandableSwipeableItemAdapter<?, ?> adapter = (BaseExpandableSwipeableItemAdapter<?, ?>) mExpandableItemAdapter; //noinspection UnnecessaryLocalVariable final int flatPosition = position; final long expandablePosition = mPositionTranslator.getExpandablePosition(flatPosition); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); return ExpandableSwipeableItemInternalUtils.invokeOnSwipeItem( adapter, holder, groupPosition, childPosition, result); }
/** * <p>Returns the packed position representation of a child position.</p> * <p>In general, a packed position should be used in situations where the position given to/returned from * {@link RecyclerViewExpandableItemManager} method can either be a child or group. * The two positions are packed into a single long which can be unpacked using {@link #getPackedPositionChild(long)} and * {@link #getPackedPositionGroup(long)}.</p> * * @param groupPosition The child's parent group's position * @param childPosition The child position within the group * @return The packed position representation of the child (and parent group). */ public static long getPackedPositionForChild(int groupPosition, int childPosition) { return ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, childPosition); }
/** * Returns the packed position representation of a group's position. See {@link #getPackedPositionForChild(int, int)}. * * @param groupPosition The child's parent group's position. * @return The packed position representation of the group. */ public static long getPackedPositionForGroup(int groupPosition) { return ExpandableAdapterHelper.getPackedPositionForGroup(groupPosition); }
expandablePosition = ExpandableAdapterHelper.getPackedPositionForGroup(i); break; } else { expandablePosition = ExpandableAdapterHelper.getPackedPositionForChild(i, (flatPosition - offset)); break; } else {
final int fromGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandableFromPosition); final int fromChildPosition = ExpandableAdapterHelper.getPackedPositionChild(expandableFromPosition); final int toGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandableToPosition); final int toChildPosition = ExpandableAdapterHelper.getPackedPositionChild(expandableToPosition); ExpandableAdapterHelper.getPackedPositionForChild(fromGroupPosition, modToChildPosition)); actualToFlatPosition = mPositionTranslator.getFlatPosition(ExpandableAdapterHelper.getPackedPositionForGroup(toGroupPosition));
/** * Gets the child position from a packed position. * To get the group that this child belongs to, use {@link #getPackedPositionGroup(long)}. * See {@link #getPackedPositionForChild(int, int)}. * * @param packedPosition The packed position from which the child position will be returned. * @return The child position portion of the packed position. If this does not contain a child, returns {@link androidx.recyclerview.widget.RecyclerView#NO_POSITION}. */ public static int getPackedPositionChild(long packedPosition) { return ExpandableAdapterHelper.getPackedPositionChild(packedPosition); }
/** * Gets the group position from a packed position. See {@link #getPackedPositionForChild(int, int)}. * * @param packedPosition The packed position from which the group position will be returned. * @return THe group position of the packed position. If this does not contain a group, returns {@link androidx.recyclerview.widget.RecyclerView#NO_POSITION}. */ public static int getPackedPositionGroup(long packedPosition) { return ExpandableAdapterHelper.getPackedPositionGroup(packedPosition); }
final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); final long startPackedGroupPosition = ExpandableAdapterHelper.getPackedPositionForGroup(range.getStart()); final long endPackedGroupPosition = ExpandableAdapterHelper.getPackedPositionForGroup(range.getEnd()); final int start = mPositionTranslator.getFlatPosition(startPackedGroupPosition); int end = mPositionTranslator.getFlatPosition(endPackedGroupPosition); final long startPackedGroupPosition = ExpandableAdapterHelper.getPackedPositionForGroup(range.getStart()); final long endPackedGroupPosition = ExpandableAdapterHelper.getPackedPositionForGroup(range.getEnd()); final int end = mPositionTranslator.getFlatPosition(endPackedGroupPosition) + mPositionTranslator.getVisibleChildCount(range.getEnd()); final int childStart = Math.min(range.getStart(), maxChildrenPos); final int childEnd = Math.min(range.getEnd(), maxChildrenPos); final long startPackedChildPosition = ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, childStart); final long endPackedChildPosition = ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, childEnd); final int start = mPositionTranslator.getFlatPosition(startPackedChildPosition); final int end = mPositionTranslator.getFlatPosition(endPackedChildPosition);
final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(packedPosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(packedPosition); final int groupCount = mGroupCount;
/*package*/ void notifyGroupItemChanged(int groupPosition, Object payload) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForGroup(groupPosition); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); if (flatPosition != RecyclerView.NO_POSITION) { notifyItemChanged(flatPosition, payload); } }
/*package*/ void notifyChildItemRangeChanged(int groupPosition, int childPositionStart, int itemCount, Object payload) { final int visibleChildCount = mPositionTranslator.getVisibleChildCount(groupPosition); // notify if the group is expanded if ((visibleChildCount > 0) && (childPositionStart < visibleChildCount)) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, 0); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); if (flatPosition != RecyclerView.NO_POSITION) { final int startPosition = flatPosition + childPositionStart; final int count = Math.min(itemCount, (visibleChildCount - childPositionStart)); notifyItemRangeChanged(startPosition, count, payload); } } }
@SuppressWarnings("unchecked") @Override public void onSwipeItemStarted(@NonNull RecyclerView.ViewHolder holder, int position) { if (!(mExpandableItemAdapter instanceof BaseExpandableSwipeableItemAdapter)) { return; } final BaseExpandableSwipeableItemAdapter adapter = (BaseExpandableSwipeableItemAdapter) mExpandableItemAdapter; //noinspection UnnecessaryLocalVariable final int flatPosition = position; final long expandablePosition = mPositionTranslator.getExpandablePosition(flatPosition); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); if (childPosition == RecyclerView.NO_POSITION) { adapter.onSwipeGroupItemStarted(holder, groupPosition); } else { adapter.onSwipeChildItemStarted(holder, groupPosition, childPosition); } }
/*package*/ void notifyGroupAndChildrenItemsChanged(int groupPosition, Object payload) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForGroup(groupPosition); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); final int visibleChildCount = mPositionTranslator.getVisibleChildCount(groupPosition); if (flatPosition != RecyclerView.NO_POSITION) { notifyItemRangeChanged(flatPosition, 1 + visibleChildCount, payload); } }
/*package*/ void notifyChildItemInserted(int groupPosition, int childPosition) { mPositionTranslator.insertChildItem(groupPosition, childPosition); final long packedPosition = ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, childPosition); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); if (flatPosition != RecyclerView.NO_POSITION) { notifyItemInserted(flatPosition); } }
@Override public int getItemViewType(int position) { if (mExpandableItemAdapter == null) { return 0; } final long expandablePosition = mPositionTranslator.getExpandablePosition(position); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); final int type; if (childPosition == RecyclerView.NO_POSITION) { type = mExpandableItemAdapter.getGroupItemViewType(groupPosition); } else { type = mExpandableItemAdapter.getChildItemViewType(groupPosition, childPosition); } if ((type & VIEW_TYPE_FLAG_IS_GROUP) != 0) { throw new IllegalStateException("Illegal view type (type = " + Integer.toHexString(type) + ")"); } return (childPosition == RecyclerView.NO_POSITION) ? (type | VIEW_TYPE_FLAG_IS_GROUP) : (type); }
/*package*/ void notifyGroupItemRemoved(int groupPosition) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForGroup(groupPosition); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); int removedCount = mPositionTranslator.removeGroupItem(groupPosition); if (removedCount > 0) { notifyItemRangeRemoved(flatPosition, removedCount); } }
/*package*/ void notifyChildItemRemoved(int groupPosition, int childPosition) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, childPosition); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); mPositionTranslator.removeChildItem(groupPosition, childPosition); if (flatPosition != RecyclerView.NO_POSITION) { notifyItemRemoved(flatPosition); } }
@SuppressWarnings("unchecked") @Override public int onGetSwipeReactionType(@NonNull RecyclerView.ViewHolder holder, int position, int x, int y) { if (!(mExpandableItemAdapter instanceof BaseExpandableSwipeableItemAdapter)) { return RecyclerViewSwipeManager.REACTION_CAN_NOT_SWIPE_ANY; } final BaseExpandableSwipeableItemAdapter adapter = (BaseExpandableSwipeableItemAdapter) mExpandableItemAdapter; //noinspection UnnecessaryLocalVariable final int flatPosition = position; final long expandablePosition = mPositionTranslator.getExpandablePosition(flatPosition); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); if (childPosition == RecyclerView.NO_POSITION) { return adapter.onGetGroupItemSwipeReactionType(holder, groupPosition, x, y); } else { return adapter.onGetChildItemSwipeReactionType(holder, groupPosition, childPosition, x, y); } }
/*package*/ void notifyGroupItemRangeRemoved(int groupPositionStart, int count) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForGroup(groupPositionStart); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); int removedCount = mPositionTranslator.removeGroupItems(groupPositionStart, count); if (removedCount > 0) { notifyItemRangeRemoved(flatPosition, removedCount); } }
/*package*/ void notifyChildrenOfGroupItemChanged(int groupPosition, Object payload) { final int visibleChildCount = mPositionTranslator.getVisibleChildCount(groupPosition); // notify if the group is expanded if (visibleChildCount > 0) { final long packedPosition = ExpandableAdapterHelper.getPackedPositionForChild(groupPosition, 0); final int flatPosition = mPositionTranslator.getFlatPosition(packedPosition); if (flatPosition != RecyclerView.NO_POSITION) { notifyItemRangeChanged(flatPosition, visibleChildCount, payload); } } }