使用 GridLayoutManager 制作一个包含 9 个项目的 Recyclerview 适合屏幕
Make a Recyclerview of 9 items with GridLayoutManager fit the screen
我有一个由 RecyclerView
和 GridLayoutManager 生成的网格,所以在我的例子中,网格上总是只有 9 个项目,所以我希望它们填满整个屏幕。下面是它们在我的屏幕上的样子:
这是 activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
那么,single_item.xml
是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="120dp"
android:padding="1dp"
>
<ImageView
android:id="@+id/image_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
/>
</RelativeLayout>
我是如何附加 Gridlayoutmanager 的:
rv = findViewById(R.id.rv);
ImageAdapter imageAdapter = new ImageAdapter(allBitmaps, MainActivity.this);
mLayoutManager = new GridLayoutManager(MainActivity.this, 3);
rv.setLayoutManager(mLayoutManager);
rv.setAdapter(imageAdapter);
所以我希望网格适合整个屏幕,如何才能做到最好?
我想如果你想让那些图片填满屏幕,你需要修改你单人里面图片的宽和高item.xml
场景如下:
- 在连接适配器之前测量
RecycerView
的宽度和高度:
- 将上一步的宽高除以3得到想要的
RecyclerView
项宽高;因为你有 3 个水平和垂直的项目。
- 将项目宽度和高度作为参数传递给
RecyclerView
适配器并将它们存储为字段。
在activity onCreate():
recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (recyclerView.getViewTreeObserver().isAlive())
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
float width = (float) recyclerView.getWidth() / 3;
float height = (float) recyclerView.getHeight() / 3;
ImageAdapter adapter = new ImageAdapter(context, width, height, allBitmaps);
recyclerView.setAdapter(adapter);
return true;
}
});
- 在
ViewHolder
中设置 ImageView
宽度和高度:
class ViewHolder extends RecyclerView.ViewHolder {
ImageView image;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
image.getLayoutParams().width = (int) itemWidth;
image.getLayoutParams().height = (int) itemHeight;
}
}
我仅使用 ImageView
作为列表项布局对此进行了测试:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitXY" />
纵向预览:
横向预览:
我有一个由 RecyclerView
和 GridLayoutManager 生成的网格,所以在我的例子中,网格上总是只有 9 个项目,所以我希望它们填满整个屏幕。下面是它们在我的屏幕上的样子:
这是 activity_main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
那么,single_item.xml
是:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="120dp"
android:padding="1dp"
>
<ImageView
android:id="@+id/image_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
/>
</RelativeLayout>
我是如何附加 Gridlayoutmanager 的:
rv = findViewById(R.id.rv);
ImageAdapter imageAdapter = new ImageAdapter(allBitmaps, MainActivity.this);
mLayoutManager = new GridLayoutManager(MainActivity.this, 3);
rv.setLayoutManager(mLayoutManager);
rv.setAdapter(imageAdapter);
所以我希望网格适合整个屏幕,如何才能做到最好?
我想如果你想让那些图片填满屏幕,你需要修改你单人里面图片的宽和高item.xml
场景如下:
- 在连接适配器之前测量
RecycerView
的宽度和高度: - 将上一步的宽高除以3得到想要的
RecyclerView
项宽高;因为你有 3 个水平和垂直的项目。 - 将项目宽度和高度作为参数传递给
RecyclerView
适配器并将它们存储为字段。
在activity onCreate():
recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (recyclerView.getViewTreeObserver().isAlive())
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
float width = (float) recyclerView.getWidth() / 3;
float height = (float) recyclerView.getHeight() / 3;
ImageAdapter adapter = new ImageAdapter(context, width, height, allBitmaps);
recyclerView.setAdapter(adapter);
return true;
}
});
- 在
ViewHolder
中设置ImageView
宽度和高度:
class ViewHolder extends RecyclerView.ViewHolder {
ImageView image;
public ViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
image.getLayoutParams().width = (int) itemWidth;
image.getLayoutParams().height = (int) itemHeight;
}
}
我仅使用 ImageView
作为列表项布局对此进行了测试:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitXY" />
纵向预览:
横向预览: