internal virtual void LayoutChunk(FlexibleViewRecycler recycler, LayoutState layoutState, LayoutChunkResult result) { FlexibleViewViewHolder holder = layoutState.Next(recycler); if (holder == null) { // if we are laying out views in scrap, this may return null which means there is // no more items to layout. result.Finished = true; return; } if (mShouldReverseLayout == (layoutState.LayoutDirection == LayoutState.LAYOUT_START)) { AddView(holder); } else { AddView(holder, 0); } result.Consumed = orientationHelper.GetViewHolderMeasurement(holder); float left, top, width, height; if (Orientation == VERTICAL) { width = Width - PaddingLeft - PaddingRight; height = result.Consumed; left = PaddingLeft; if (layoutState.LayoutDirection == LayoutState.LAYOUT_END) { top = layoutState.Offset; } else { top = layoutState.Offset - height; } LayoutChild(holder, left, top, width, height); } else { width = result.Consumed; height = Height - PaddingTop - PaddingBottom; top = PaddingTop; if (layoutState.LayoutDirection == LayoutState.LAYOUT_END) { left = layoutState.Offset; } else { left = layoutState.Offset - width; } LayoutChild(holder, left, top, width, height); } result.Focusable = true; }
internal override void LayoutChunk(FlexibleView.Recycler recycler, LayoutState layoutState, LayoutChunkResult result) { bool layingOutInPrimaryDirection = layoutState.ItemDirection == LayoutState.ITEM_DIRECTION_TAIL; int count = mSpanCount; for (int i = 0; i < count; i++) { FlexibleView.ViewHolder holder = layoutState.Next(recycler); if (holder == null) { result.Finished = true; return; } if (layingOutInPrimaryDirection) { AddView(holder); } else { AddView(holder, 0); } result.Consumed = mOrientationHelper.GetViewHolderMeasurement(holder); float left, top, width, height; if (mOrientation == VERTICAL) { width = (Width - PaddingLeft - PaddingRight) / count; height = result.Consumed; if (layoutState.LayoutDirection == LayoutState.LAYOUT_END) { left = PaddingLeft + width * i; top = layoutState.Offset; } else { left = PaddingLeft + width * (count - 1 - i); top = layoutState.Offset - height; } LayoutChild(holder, left, top, width, height); } else { width = result.Consumed; height = (Height - PaddingTop - PaddingBottom) / count; if (layoutState.LayoutDirection == LayoutState.LAYOUT_END) { top = PaddingTop + height * i; left = layoutState.Offset; } else { top = PaddingTop + height * (count - 1 - i); left = layoutState.Offset - width; } LayoutChild(holder, left, top, width, height); } } }
private float Fill(FlexibleView.Recycler recycler, LayoutState layoutState, bool stopOnFocusable, bool immediate) { float start = layoutState.Available; if (layoutState.ScrollingOffset != LayoutState.SCROLLING_OFFSET_NaN) { // TODO ugly bug fix. should not happen if (layoutState.Available < 0) { layoutState.ScrollingOffset += layoutState.Available; } if (immediate == true) { RecycleByLayoutState(recycler, layoutState, true); } } float remainingSpace = layoutState.Available + layoutState.Extra; LayoutChunkResult layoutChunkResult = mLayoutChunkResult; while ((remainingSpace > 0) && layoutState.HasMore(ItemCount)) { layoutChunkResult.ResetInternal(); LayoutChunk(recycler, layoutState, layoutChunkResult); if (layoutChunkResult.Finished) { break; } layoutState.Offset += layoutChunkResult.Consumed * layoutState.LayoutDirection; // Consume the available space if: // layoutChunk did not request to be ignored // OR we are laying out scrap children // OR we are not doing pre-layout if (!layoutChunkResult.IgnoreConsumed) { layoutState.Available -= layoutChunkResult.Consumed; // we keep a separate remaining space because mAvailable is important for recycling remainingSpace -= layoutChunkResult.Consumed; } if (layoutState.ScrollingOffset != LayoutState.SCROLLING_OFFSET_NaN) { layoutState.ScrollingOffset += layoutChunkResult.Consumed; if (layoutState.Available < 0) { layoutState.ScrollingOffset += layoutState.Available; } if (immediate == true) { RecycleByLayoutState(recycler, layoutState, true); } } if (stopOnFocusable && layoutChunkResult.Focusable) { break; } } if (immediate == false) { RecycleByLayoutState(recycler, layoutState, false); } return(start - layoutState.Available); }