public long unwrapViewType(int viewType) { final int flattenSegment = ItemViewTypeComposer.extractSegmentPart(viewType); final int index = mUnwrapSegmentMap.indexOfKey(flattenSegment); if (index < 0) { throw new IllegalStateException("Corresponding wrapped view type is not found!"); } final int packedSegments = mUnwrapSegmentMap.valueAt(index); //noinspection BooleanMethodIsAlwaysInverted final long packedViewType = (((long) packedSegments) << 32) | (((long) viewType) & 0xFFFFFFFFL); return packedViewType; }
@Test public void extractSegmentPart() throws Exception { // zero assertThat(ItemViewTypeComposer.extractSegmentPart(0), is(0)); // one assertThat(ItemViewTypeComposer.extractSegmentPart(1 << ItemViewTypeComposer.BIT_OFFSET_SEGMENT), is(1)); // min assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.MIN_SEGMENT << ItemViewTypeComposer.BIT_OFFSET_SEGMENT), is(ItemViewTypeComposer.MIN_SEGMENT)); // max assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.MAX_SEGMENT << ItemViewTypeComposer.BIT_OFFSET_SEGMENT), is(ItemViewTypeComposer.MAX_SEGMENT)); // etc - 1 assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.BIT_MASK_EXPANDABLE_FLAG | ItemViewTypeComposer.BIT_MASK_WRAPPED_VIEW_TYPE), is(0)); // etc - 2 assertThat(ItemViewTypeComposer.extractSegmentPart(ItemViewTypeComposer.BIT_MASK_SEGMENT), is(ItemViewTypeComposer.MAX_SEGMENT)); }
public int wrapItemViewType(int segment, int viewType) { final int packedSegments = (segment << 16) | ItemViewTypeComposer.extractSegmentPart(viewType); final int flattenSegments; final int index = mWrapSegmentMap.indexOfKey(packedSegments); if (index >= 0) { flattenSegments = mWrapSegmentMap.valueAt(index); } else { flattenSegments = mWrapSegmentMap.size() + 1; if (flattenSegments > ItemViewTypeComposer.MAX_SEGMENT) { throw new IllegalStateException("Failed to allocate a new wrapped view type."); } mWrapSegmentMap.put(packedSegments, flattenSegments); mUnwrapSegmentMap.put(flattenSegments, packedSegments); } return ItemViewTypeComposer.composeSegment(flattenSegments, viewType); }
/** * {@inheritDoc} */ @Override public long getItemId(int position) { final long segmentedPosition = getSegmentedPosition(position); final int segment = AdaptersSet.extractSegment(segmentedPosition); final int offset = AdaptersSet.extractSegmentOffset(segmentedPosition); final RecyclerView.Adapter adapter = mAdaptersSet.getAdapter(segment); final int rawViewType = adapter.getItemViewType(offset); final long rawId = adapter.getItemId(offset); final int wrappedViewType = mViewTypeTranslator.wrapItemViewType(segment, rawViewType); final int wrappedSegment = ItemViewTypeComposer.extractSegmentPart(wrappedViewType); return ItemIdComposer.composeSegment(wrappedSegment, rawId); }