bringToFront在RecyclerView中不起作用

Juu*_*ude 5 android android-layout android-recyclerview

我想制作一个动画,RecyclerView其中要求孩子拥有比另一个孩子更大的z指数.但是,当我使用它的bringToFront方法时,ViewGroup它不起作用.

有没有办法把孩子带到前面RecyclerView

Zso*_*any 8

的确,bringToFront()没有帮助; 它只是更改其父级子数组中子项的顺序,但它不会更改子项的呈现顺序.

如果您使用的是API-21或更高版本,则只需更改Zview(view.setZ(..))的值即可将其置于最前面.

在API-21下面有一个你可以使用的回调:RecyclerView.ChildDrawingOrderCallback.有了它,您可以定义子项应该呈现的顺序.(如果您不喜欢通过更改Z值获得的额外阴影,也可以使用API​​-21 + .)

例:

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();
Run Code Online (Sandbox Code Playgroud)

基本上,onGetChildDrawingOrder(...)将被调用childCount次数,并且在每个中iteration我们可以指定要渲染的子项(通过返回其索引).


yig*_*git 5

子项的顺序由LayoutManager控制.由于性能原因,内置的LayoutManagers有自己严格的子命令.

当前实现的bringToFront只是将子项移动到子列表的末尾,这对现有的LayoutManagers不起作用.

如果您要定位Lollipop,则可以使用setElevation方法.要定位较旧的平台,您需要一个不依赖于子项顺序的自定义LayoutManager.

  • 对这个已有 5 年历史的答案进行了一些更新:RecyclerView 现在提供了一个 API 来使用 `setChildDrawingOrderCallback()` 来覆盖绘图顺序。 (2认同)