Rzeczywiście, bringToFront()
nie pomaga; zmienia po prostu kolejność elementów podrzędnych w tablicy potomnej rodzica, ale nie zmienia kolejności, w jakiej są renderowane elementy podrzędne.
Jeśli używasz interfejsu API-21 lub nowszego, możesz po prostu zmienić wartość widoku Z
(view.setZ(..)
) w celu przeniesienia go na wierzch.
Poniżej interfejsu API-21 można użyć wywołania zwrotnego: RecyclerView.ChildDrawingOrderCallback
. Dzięki niemu możesz zdefiniować kolejność, w jakiej dzieci powinny być renderowane. (Możesz także użyć tego z API-21 +, jeśli nie podoba ci się dodatkowy cień, który otrzymujesz, zmieniając wartość Z
.)
Przykład:
final int indexOfFrontChild = rv.indexOfChild(desiredFrontView);
rv.setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() {
private int nextChildIndexToRender;
@Override
public int onGetChildDrawingOrder(int childCount, int iteration) {
if (iteration == childCount - 1) {
// in the last iteration return the index of the child
// we want to bring to front (and reset nextChildIndexToRender)
nextChildIndexToRender = 0;
return indexOfFrontChild;
} else {
if (nextChildIndexToRender == indexOfFrontChild) {
// skip this index; we will render it during last iteration
nextChildIndexToRender++;
}
return nextChildIndexToRender++;
}
}
});
rv.invalidate();
Zasadniczo onGetChildDrawingOrder(...)
zostanie wywołana childCount
razy iw każdym iteration
możemy określić, które dziecko do renderowania (wracając swój indeks).
Dzięki, ale zwyczaj LayoutManager może budzić pewną złożoność, udało mi się zrobić jakąś sztuczkę sklonować pogląd Chcę animować. – Juude