/** * <p>Gets combined ID for child item.</p> * <p>bit 0-27: all bits are set to 1 * bit 28-55: Lower 28 bits of the groupId * bit 56-61: reserved</p> * * @param groupId The ID of the group that contains the child. * @return The unique ID of the child across all groups and children in the list */ public static long getCombinedGroupId(long groupId) { return ItemIdComposer.composeExpandableGroupId(groupId); }
@Test public void composeExpandableGroupId() throws Exception { // zero //noinspection PointlessBitwiseExpression assertThat(ItemIdComposer.composeExpandableGroupId(0L), is((0L << ItemIdComposer.BIT_OFFSET_GROUP_ID) | ItemIdComposer.BIT_MASK_CHILD_ID)); // one assertThat(ItemIdComposer.composeExpandableGroupId(1L), is((1L << ItemIdComposer.BIT_OFFSET_GROUP_ID) | ItemIdComposer.BIT_MASK_CHILD_ID)); // minus one assertThat(ItemIdComposer.composeExpandableGroupId(-1L), is(ItemIdComposer.BIT_MASK_GROUP_ID | ItemIdComposer.BIT_MASK_CHILD_ID)); // min assertThat( ItemIdComposer.composeExpandableGroupId(ItemIdComposer.MIN_GROUP_ID), is(genBitMask(1, (ItemIdComposer.BIT_WIDTH_GROUP_ID - 1) + ItemIdComposer.BIT_OFFSET_GROUP_ID) | ItemIdComposer.BIT_MASK_CHILD_ID)); // max assertThat( ItemIdComposer.composeExpandableGroupId(ItemIdComposer.MAX_GROUP_ID), is(genBitMask(ItemIdComposer.BIT_WIDTH_GROUP_ID - 1, ItemIdComposer.BIT_OFFSET_GROUP_ID) | ItemIdComposer.BIT_MASK_CHILD_ID)); }
@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); } }
@Test public void extractExpandableGroupIdPart() throws Exception { // invalid - 1 assertThat(ItemIdComposer.extractExpandableGroupIdPart(0L), is(RecyclerView.NO_ID)); // invalid - 2 assertThat(ItemIdComposer.extractExpandableGroupIdPart(1), is(RecyclerView.NO_ID)); // invalid - 3 assertThat(ItemIdComposer.extractExpandableGroupIdPart(RecyclerView.NO_ID), is(RecyclerView.NO_ID)); // zero assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.composeExpandableGroupId(0L)), is(0L)); // one assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.composeExpandableGroupId(1L)), is(1L)); // minus one assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.composeExpandableGroupId(-1L)), is(-1L)); // min assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.composeExpandableGroupId(ItemIdComposer.MIN_GROUP_ID)), is(ItemIdComposer.MIN_GROUP_ID)); // max assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.composeExpandableGroupId(ItemIdComposer.MAX_GROUP_ID)), is(ItemIdComposer.MAX_GROUP_ID)); // etc - 1 assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.BIT_MASK_RESERVED_SIGN_FLAG | ItemIdComposer.BIT_MASK_CHILD_ID), is(0L)); // etc - 2 assertThat(ItemIdComposer.extractExpandableGroupIdPart(ItemIdComposer.BIT_MASK_SEGMENT | ItemIdComposer.BIT_MASK_CHILD_ID), is(0L)); }
@Test public void extractExpandableChildIdPart() throws Exception { // invalid - 1 assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.composeExpandableGroupId(0L)), is(RecyclerView.NO_ID)); // invalid - 2 assertThat(ItemIdComposer.extractExpandableChildIdPart(RecyclerView.NO_ID), is(RecyclerView.NO_ID)); // zero assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.composeExpandableChildId(0L, 0L)), is(0L)); // one assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.composeExpandableChildId(0L, 1L)), is(1L)); // minus one assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.composeExpandableChildId(0L, -1L)), is(-1L)); // min assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.composeExpandableChildId(0L, ItemIdComposer.MIN_CHILD_ID)), is(ItemIdComposer.MIN_CHILD_ID)); // max assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.composeExpandableChildId(0L, ItemIdComposer.MAX_CHILD_ID)), is(ItemIdComposer.MAX_CHILD_ID)); // etc - 1 assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.BIT_MASK_RESERVED_SIGN_FLAG), is(0L)); // etc - 2 assertThat(ItemIdComposer.extractExpandableChildIdPart(ItemIdComposer.BIT_MASK_SEGMENT), is(0L)); }