/** * 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(packedPosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(packedPosition); final int groupCount = mGroupCount;
@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); }
@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); }
@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); } }
@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); } }
@SuppressWarnings("unchecked") @Override public void onSetSwipeBackground(@NonNull RecyclerView.ViewHolder holder, int position, int type) { 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.onSetGroupItemSwipeBackground(holder, groupPosition, type); } else { adapter.onSetChildItemSwipeBackground(holder, groupPosition, childPosition, type); } }
@SuppressWarnings("unchecked") @Override public boolean onCheckCanStartDrag(@NonNull RecyclerView.ViewHolder holder, int position, int x, int y) { if (!(mExpandableItemAdapter instanceof ExpandableDraggableItemAdapter)) { return false; } final ExpandableDraggableItemAdapter adapter = (ExpandableDraggableItemAdapter) 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); boolean canStart; if (childPosition == RecyclerView.NO_POSITION) { canStart = adapter.onCheckGroupCanStartDrag(holder, groupPosition, x, y); } else { canStart = adapter.onCheckChildCanStartDrag(holder, groupPosition, childPosition, x, y); } mDraggingItemGroupRangeStart = RecyclerView.NO_POSITION; mDraggingItemGroupRangeEnd = RecyclerView.NO_POSITION; mDraggingItemChildRangeStart = RecyclerView.NO_POSITION; mDraggingItemChildRangeEnd = RecyclerView.NO_POSITION; return canStart; }
@Override public void onItemDragStarted(int position) { if (!(mExpandableItemAdapter instanceof ExpandableDraggableItemAdapter)) { return; } final ExpandableDraggableItemAdapter adapter = (ExpandableDraggableItemAdapter) mExpandableItemAdapter; //noinspection UnnecessaryLocalVariable final int flatPosition = position; final long draggingExpandablePosition = mPositionTranslator.getExpandablePosition(flatPosition); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(draggingExpandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(draggingExpandablePosition); if (childPosition == RecyclerView.NO_POSITION) { // group adapter.onGroupDragStarted(groupPosition); } else { // child adapter.onChildDragStarted(groupPosition, childPosition); } }
@SuppressWarnings("unchecked") boolean onTapItem(@NonNull RecyclerView.ViewHolder holder, int position, int x, int y) { if (mExpandableItemAdapter == null) { return false; } //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 false; } final boolean expand = !(mPositionTranslator.isGroupExpanded(groupPosition)); boolean result = mExpandableItemAdapter.onCheckCanExpandOrCollapseGroup(holder, groupPosition, x, y, expand); if (!result) { return false; } if (expand) { expandGroup(groupPosition, true, null); } else { collapseGroup(groupPosition, true, null); } return true; }
fromGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(fromDraggingExpandablePosition); fromChildPosition = ExpandableAdapterHelper.getPackedPositionChild(fromDraggingExpandablePosition);
@SuppressWarnings("unchecked") @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) { if (mExpandableItemAdapter == null) { return; } final long expandablePosition = mPositionTranslator.getExpandablePosition(position); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); final int viewType = (holder.getItemViewType() & (~VIEW_TYPE_FLAG_IS_GROUP)); // update flags int flags = 0; if (childPosition == RecyclerView.NO_POSITION) { flags |= Constants.STATE_FLAG_IS_GROUP; } else { flags |= Constants.STATE_FLAG_IS_CHILD; } if (mPositionTranslator.isGroupExpanded(groupPosition)) { flags |= Constants.STATE_FLAG_IS_EXPANDED; } safeUpdateExpandStateFlags(holder, flags); correctItemDragStateFlags(holder, groupPosition, childPosition); if (childPosition == RecyclerView.NO_POSITION) { mExpandableItemAdapter.onBindGroupViewHolder(holder, groupPosition, viewType, payloads); } else { mExpandableItemAdapter.onBindChildViewHolder(holder, groupPosition, childPosition, viewType, payloads); } }
@Override protected void onHandleWrappedAdapterItemRangeRemoved(int positionStart, int itemCount) { if (itemCount == 1) { final long expandablePosition = mPositionTranslator.getExpandablePosition(positionStart); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); if (childPosition == RecyclerView.NO_POSITION) { mPositionTranslator.removeGroupItem(groupPosition); } else { mPositionTranslator.removeChildItem(groupPosition, childPosition); } } else { rebuildPositionTranslator(); } super.onHandleWrappedAdapterItemRangeRemoved(positionStart, itemCount); }
@Override public long getItemId(int position) { if (mExpandableItemAdapter == null) { return RecyclerView.NO_ID; } final long expandablePosition = mPositionTranslator.getExpandablePosition(position); final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition); if (childPosition == RecyclerView.NO_POSITION) { final long groupId = mExpandableItemAdapter.getGroupId(groupPosition); return ItemIdComposer.composeExpandableGroupId(groupId); } else { final long groupId = mExpandableItemAdapter.getGroupId(groupPosition); final long childId = mExpandableItemAdapter.getChildId(groupPosition, childPosition); return ItemIdComposer.composeExpandableChildId(groupId, childId); } }
final int draggingGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(draggingExpandablePosition); final int draggingChildPosition = ExpandableAdapterHelper.getPackedPositionChild(draggingExpandablePosition); final int dropGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(dropExpandablePosition); final int dropChildPosition = ExpandableAdapterHelper.getPackedPositionChild(dropExpandablePosition);
final int groupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandablePosition); final int childPosition = ExpandableAdapterHelper.getPackedPositionChild(expandablePosition);
final int fromGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandableFromPosition); final int fromChildPosition = ExpandableAdapterHelper.getPackedPositionChild(expandableFromPosition); final int toGroupPosition = ExpandableAdapterHelper.getPackedPositionGroup(expandableToPosition); final int toChildPosition = ExpandableAdapterHelper.getPackedPositionChild(expandableToPosition);