/** * <p>Collapse all groups.</p> * <p>Note that this method does not invoke the {@link OnGroupCollapseListener#onGroupCollapse(int, boolean, Object)} callback.</p> */ public void collapseAll() { if (mWrapperAdapter != null) { mWrapperAdapter.collapseAll(); } }
/** * Collapse a group. * * @param groupPosition The group position to be collapsed * @param payload Optional parameter, use null to identify a "full" update the group item * @return True if the group was collapsed, false otherwise (If the group was already collapsed, this will return false) */ public boolean collapseGroup(int groupPosition, Object payload) { return (mWrapperAdapter != null) && mWrapperAdapter.collapseGroup(groupPosition, false, payload); }
/** * <p>Expand all groups.</p> * <p>Note that this method does not invoke the {@link OnGroupExpandListener#onGroupExpand(int, boolean, Object)} callback.</p> */ public void expandAll() { if (mWrapperAdapter != null) { mWrapperAdapter.expandAll(); } }
/** * Create wrapped adapter. * * @param adapter The target adapter. * @return Wrapped adapter which is associated to this {@link RecyclerViewExpandableItemManager} instance. */ @SuppressWarnings("unchecked") @NonNull public RecyclerView.Adapter createWrappedAdapter(@NonNull RecyclerView.Adapter adapter) { if (!adapter.hasStableIds()) { throw new IllegalArgumentException("The passed adapter does not support stable IDs"); } if (mWrapperAdapter != null) { throw new IllegalStateException("already have a wrapped adapter"); } long[] adapterSavedState = (mSavedState != null) ? mSavedState.adapterSavedState : null; mSavedState = null; mWrapperAdapter = new ExpandableRecyclerViewWrapperAdapter(this, adapter, adapterSavedState); // move listeners to wrapper adapter mWrapperAdapter.setOnGroupExpandListener(mOnGroupExpandListener); mOnGroupExpandListener = null; mWrapperAdapter.setOnGroupCollapseListener(mOnGroupCollapseListener); mOnGroupCollapseListener = null; return mWrapperAdapter; }
@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; }
@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); } }
/** * Gets the number of collapsed groups. * * @return the number of collapsed groups */ public int getCollapsedGroupsCount() { return mWrapperAdapter.getCollapsedGroupsCount(); }
/** * Expand a group. * * @param groupPosition The group position to be expanded * @param payload Optional parameter, use null to identify a "full" update the group item * @return True if the group was expanded, false otherwise (If the group was already expanded, this will return false) */ public boolean expandGroup(int groupPosition, Object payload) { return (mWrapperAdapter != null) && mWrapperAdapter.expandGroup(groupPosition, false, payload); }
/** * Gets the number of children in a specified group. * * @param groupPosition the position of the group for which the children count should be returned * @return the number of children */ public int getChildCount(int groupPosition) { return mWrapperAdapter.getChildCount(groupPosition); }
/** * Converts a flat position (the raw position of an item in the list) to a group and/or child position * (represented in a packed position). Use {@link #getPackedPositionChild(long)}, {@link #getPackedPositionGroup(long)} to unpack. * * @param flatPosition The flat position to be converted * @return The group and/or child position for the given flat position in packed position representation. */ public long getExpandablePosition(int flatPosition) { if (mWrapperAdapter == null) { return ExpandableAdapterHelper.NO_EXPANDABLE_POSITION; } return mWrapperAdapter.getExpandablePosition(flatPosition); }
public ExpandableRecyclerViewWrapperAdapter(RecyclerViewExpandableItemManager manager, RecyclerView.Adapter<RecyclerView.ViewHolder> adapter, long[] expandedItemsSavedState) { super(adapter); mExpandableItemAdapter = getExpandableItemAdapter(adapter); if (mExpandableItemAdapter == null) { throw new IllegalArgumentException("adapter does not implement ExpandableItemAdapter"); } if (manager == null) { throw new IllegalArgumentException("manager cannot be null"); } mExpandableListManager = manager; mPositionTranslator = new ExpandablePositionTranslator(); mPositionTranslator.build( mExpandableItemAdapter, ExpandablePositionTranslator.BUILD_OPTION_DEFAULT, mExpandableListManager.getDefaultGroupsExpandedState()); if (expandedItemsSavedState != null) { // NOTE: do not call hook routines and listener methods mPositionTranslator.restoreExpandedGroupItems(expandedItemsSavedState, null, null, null); } }