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 RowsAnchorFactory extends AbstractAnchorFactory { private ChildViewsIterable childViews; public RowsAnchorFactory(RecyclerView.LayoutManager lm, ICanvas canvas) { super(lm, canvas); childViews = new ChildViewsIterable(lm); } /** get the highest views in layout. The closest to left border view will be picked from it. */ @Override public AnchorViewState getAnchor() { AnchorViewState minPosView = AnchorViewState.getNotFoundState(); int minPosition = Integer.MAX_VALUE; int minTop = Integer.MAX_VALUE; for (View view : childViews) { AnchorViewState anchorViewState = createAnchorState(view); int pos = lm.getPosition(view); int top = lm.getDecoratedTop(view); Rect viewRect = new Rect(anchorViewState.getAnchorViewRect()); if (getCanvas().isInside(viewRect) && !anchorViewState.isRemoving()) { if (minPosition > pos) { minPosition = pos; minPosView = anchorViewState; } if (minTop > top) { minTop = top; } } } if (!minPosView.isNotFoundState()) { minPosView.getAnchorViewRect().top = minTop; /* we don't need bottom coordinate for layouter also this helps to normalize row properly when anchor deleted and was the biggest view in a row */ minPosView.setPosition(minPosition); } return minPosView; } @Override public void resetRowCoordinates(AnchorViewState anchorView) { if (!anchorView.isNotFoundState()) { Rect rect = anchorView.getAnchorViewRect(); rect.left = getCanvas().getCanvasLeftBorder(); rect.right = getCanvas().getCanvasRightBorder(); } } }