使用 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" />

纵向预览:

横向预览: