/** * <p>Gets combined ID for child item.</p> * <p>bit 0-27: Lower 28 bits of the childId * 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. * @param childId The ID of the child. * @return The unique ID of the child across all groups and children in the list */ public static long getCombinedChildId(long groupId, long childId) { return ItemIdComposer.composeExpandableChildId(groupId, childId); }
@Test public void composeExpandableChildId() throws Exception { // zero assertThat(ItemIdComposer.composeExpandableChildId(0L, 0L), is(0L)); // one assertThat(ItemIdComposer.composeExpandableChildId(1L, 0L), is(1L << ItemIdComposer.BIT_OFFSET_GROUP_ID)); assertThat(ItemIdComposer.composeExpandableChildId(0L, 1L), is(1L << ItemIdComposer.BIT_OFFSET_CHILD_ID)); // minus one assertThat(ItemIdComposer.composeExpandableChildId(-1L, 0L), is(ItemIdComposer.BIT_MASK_GROUP_ID)); assertThat(ItemIdComposer.composeExpandableChildId(0L, -1L), is(ItemIdComposer.BIT_MASK_CHILD_ID)); // min assertThat(ItemIdComposer.composeExpandableChildId(ItemIdComposer.MIN_GROUP_ID, 0L), is(genBitMask(1, (ItemIdComposer.BIT_WIDTH_GROUP_ID - 1) + ItemIdComposer.BIT_OFFSET_GROUP_ID))); assertThat(ItemIdComposer.composeExpandableChildId(0L, ItemIdComposer.MIN_CHILD_ID), is(genBitMask(1, (ItemIdComposer.BIT_WIDTH_CHILD_ID - 1) + ItemIdComposer.BIT_OFFSET_CHILD_ID))); // max assertThat(ItemIdComposer.composeExpandableChildId(ItemIdComposer.MAX_GROUP_ID, 0L), is(genBitMask(ItemIdComposer.BIT_WIDTH_GROUP_ID - 1, ItemIdComposer.BIT_OFFSET_GROUP_ID))); assertThat(ItemIdComposer.composeExpandableChildId(0L, ItemIdComposer.MAX_CHILD_ID), is(genBitMask(ItemIdComposer.BIT_WIDTH_CHILD_ID - 1, ItemIdComposer.BIT_OFFSET_CHILD_ID))); }
@Test public void composeExpandableChildId_GroupIdMaxOutOfRange() throws Exception { thrown.expect(IllegalArgumentException.class); ItemIdComposer.composeExpandableChildId(ItemIdComposer.MAX_GROUP_ID + 1, 0); }
@Test public void composeExpandableChildId_GroupIdMinOutOfRange() throws Exception { thrown.expect(IllegalArgumentException.class); ItemIdComposer.composeExpandableChildId(ItemIdComposer.MIN_GROUP_ID - 1, 0); }
@Test public void composeExpandableChildId_ChildIdMinOutOfRange() throws Exception { thrown.expect(IllegalArgumentException.class); ItemIdComposer.composeExpandableChildId(0, ItemIdComposer.MIN_CHILD_ID - 1); }
@Test public void composeExpandableChildId_ChildIdMaxOutOfRange() throws Exception { thrown.expect(IllegalArgumentException.class); ItemIdComposer.composeExpandableChildId(0, ItemIdComposer.MAX_CHILD_ID + 1); }
@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)); }
@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); } }