RecyclerView + GridLayoutManager:调整项目大小以适应屏幕并保持比例
RecyclerView + GridLayoutManager: Resizing items to fit the screen and preserve ratio
我正在尝试使用 RecyclerView 和 GridLayoutManager 来显示项目列表。
以下是我想要满足的条件:
- 每一行都有一些由
spanCount
指定的项目
- 每个项目占据屏幕的相等部分,它们一起填满整个屏幕。
- 项目高度由其宽度和指定比例决定。
我发现如果我在 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 高的比例。
无论跨度数如何,这都应该有效
我正在尝试使用 RecyclerView 和 GridLayoutManager 来显示项目列表。
以下是我想要满足的条件:
- 每一行都有一些由
spanCount
指定的项目
- 每个项目占据屏幕的相等部分,它们一起填满整个屏幕。
- 项目高度由其宽度和指定比例决定。
我发现如果我在 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 高的比例。
无论跨度数如何,这都应该有效