RecyclerView + GridLayoutManager:调整项目大小以适应屏幕并保持比例

RecyclerView + GridLayoutManager: Resizing items to fit the screen and preserve ratio

我正在尝试使用 RecyclerView 和 GridLayoutManager 来显示项目列表。

以下是我想要满足的条件:

我发现如果我在 item view 上设置 android:layout_width="match_parent",那么 item 宽度将通过将 RecyclerView 的宽度除以 spanCount 来设置。

问题是我不知道如何使项目的高度与其宽度成正比(由布局管理器确定)。

我唯一的解决方案是放弃测量的布局管理器,并在 onBindViewHolder 中明确设置项目尺寸:

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_layout, parent, false);

    ViewGroup.LayoutParams p = v.getLayoutParams();

    p.width = parent.getWidth() / mLayoutManager.getSpanCount();
    p.height = p.width * 3/2;

    v.setLayoutParams(p);

    return new MyViewHolder(v);
}

我将不胜感激任何有助于我改进解决方案的建议。

item_layout xml 中使用 ConstraintLayout 怎么样? 约束布局允许您将高度设置为宽度的比率。

例如:

    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintDimensionRatio="3:2"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

    </android.support.constraint.ConstraintLayout>

所以当你使用 app:layout_constraintDimensionRatio="3:2" 您正在设置 3 宽 2 高的比例。

无论跨度数如何,这都应该有效