package com.beloo.widget.chipslayoutmanager.anchor; import android.graphics.Rect; import android.support.v7.widget.RecyclerView; import android.view.View; import com.beloo.widget.chipslayoutmanager.ChildViewsIterable; import com.beloo.widget.chipslayoutmanager.layouter.ICanvas; public class ColumnsAnchorFactory extends AbstractAnchorFactory { private ChildViewsIterable childViews; public ColumnsAnchorFactory(RecyclerView.LayoutManager lm, ICanvas canvas) { super(lm, canvas); childViews = new ChildViewsIterable(lm); } /** get the closest views to left border. The highest view will be picked from it. */ @Override public AnchorViewState getAnchor() { AnchorViewState minPosView = AnchorViewState.getNotFoundState(); int minPosition = Integer.MAX_VALUE; int minLeft = Integer.MAX_VALUE; int maxRight = Integer.MIN_VALUE; for (View view : childViews) { AnchorViewState anchorViewState = createAnchorState(view); int pos = lm.getPosition(view); int left = lm.getDecoratedLeft(view); int right = lm.getDecoratedRight(view); Rect viewRect = new Rect(anchorViewState.getAnchorViewRect()); if (getCanvas().isInside(viewRect) && !anchorViewState.isRemoving()) { if (minPosition > pos) { minPosition = pos; minPosView = anchorViewState; } if (minLeft > left) { minLeft = left; maxRight = right; } else if (minLeft == left) { maxRight = Math.max(maxRight, right); } } } if (!minPosView.isNotFoundState()) { minPosView.getAnchorViewRect().left = minLeft; minPosView.getAnchorViewRect().right = maxRight; minPosView.setPosition(minPosition); } return minPosView; } @Override public void resetRowCoordinates(AnchorViewState anchorView) { if (!anchorView.isNotFoundState()) { Rect rect = anchorView.getAnchorViewRect(); rect.top = getCanvas().getCanvasTopBorder(); rect.bottom = getCanvas().getCanvasBottomBorder(); } } }