RecyclerView与重叠元素

时间:2017-12-07 08:03:25

标签: android android-recyclerview gridlayoutmanager recyclerview-layout

我正在尝试使用 RecyclerView 创建类似于此的布局,用于类似电视的应用程序。

enter image description here

第一个元素表示焦点项目的外观。我尝试过的解决方案是:

  • 使用cardView作为元素的父布局。问题:当我通过修改它的布局参数使聚焦元素更大时,整行变大,其余行被推下
  • 使用 leanback 库中的 VerticalGridView - 按下了焦点元素所在的列
  • 尝试使用高程和 Z-translation ,但仍然按下行
  • 使 RecyclerView 高度固定,仍然是相同的行为
  • 使用 clipChildren 属性,仍然按下行

唯一有效的方法是缩放聚焦元素,但这不是一个解决方案,因为所有的孩子都被缩放,比如TextViews等,文本看起来不正确。 有没有人有这方面的解决方案?谢谢!

1 个答案:

答案 0 :(得分:0)

API 21 + 只需在您的观看中使用

 @Override
public void onFocusChange(View v, boolean hasFocus) {
    ViewCompat.setElevation(this, hasFocus?1:0);
}

API 16 + 这是我的扩展TvRecyclerView:

public class TvRecyclerView extends android.support.v7.widget.RecyclerView {

public TvRecyclerView(Context context) {
    super(context);
    setChildrenDrawingOrderEnabled(true);
}

public TvRecyclerView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setChildrenDrawingOrderEnabled(true);
}

public TvRecyclerView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setChildrenDrawingOrderEnabled(true);
    setClipToPadding(false);
}

@Override
protected int getChildDrawingOrder(int childCount, int i) {
    View view = getLayoutManager().getFocusedChild();
    if (null == view) {
        return super.getChildDrawingOrder(childCount, i);
    }
    int position = indexOfChild(view);

    if (position < 0) {
        return super.getChildDrawingOrder(childCount, i);
    }
    if (i == childCount - 1) {
        return position;
    }
    if (i == position) {
        return childCount - 1;
    }
    return super.getChildDrawingOrder(childCount, i);
}
}

基本上它只是重新排序项目,因此焦点项目始终位于顶部。

同样在您的观看中,您需要使用

@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
    v.setScaleX(1.5f);
    v.setScaleY(1.5f);
    mRecyclerView.invalidate();
} else {
    v.setScaleX(1.0f);
    v.setScaleY(1.0f);
}
}