Действительно, bringToFront()
не помогает; он просто изменяет порядок дочерних элементов в дочернем массиве его родителя, но он не меняет порядок воспроизведения детей.
Если вы используете API-21 или выше, вы можете просто изменить значение вида Z
(view.setZ(..)
), чтобы перенести его на передний план.
Ниже API-21 есть обратный вызов, который вы можете использовать: RecyclerView.ChildDrawingOrderCallback
. С его помощью можно определить, дети порядка должны быть оказаны (Вы также можете использовать этот API-21 + в случае, если вам не нравится лишняя тень вы получите, изменив значение Z
.)
. Пример:
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();
в принципе, onGetChildDrawingOrder(...)
будет называться childCount
раз и в каждом iteration
мы можем определить, какой ребенок, чтобы сделать (возвращая его индекс).
Спасибо, но обычай LayoutManager может вызвать некоторые сложности, мне удалось сделать некоторые хитрости, чтобы клонировать вид я хочу, чтобы оживить. – Juude