具有Recyclerlayout的固定大小的动态网格

时间:2019-02-26 11:09:21

标签: android android-layout

我想要一个具有固定大小但可以动态更改跨度计数的网格(因此,当跨度计数更改时,网格中的单元格大小将有所变化)。

我不想要的是:

plus/minus change spancount/itemcount

<androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- This constrainer view was something I just tested, didn't improve much. And felt hacky (I wanted to have the recyclerview as wrap content) !-->
    <View
        android:id="@+id/constrainer"
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/grid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constrainedWidth="true"
        app:layout_constrainedHeight="true"
        app:layout_constraintTop_toTopOf="@+id/constrainer"
        app:layout_constraintLeft_toLeftOf="@+id/constrainer"
        app:layout_constraintRight_toRightOf="@+id/constrainer"
        app:layout_constraintBottom_toBottomOf="@+id/constrainer"
        app:spanCount="3"
        tools:itemCount="9"
        tools:listitem="@layout/MyItem" />

和网格项:

<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="#FF00FF00"/>

下面是layoutmanager:

    grid.layoutManager = object : GridLayoutManager(this.context, adapter.size){
        override fun canScrollVertically(): Boolean {
            return false
        }

        override fun canScrollHorizontally(): Boolean {
            return false
        }
    }

上面发布的当前设置适用于x维度,但是我无法确定是否可以删除所有滚动性并使它适用于Y维度。我无法让细胞正确地增加高度。

我为该工​​作使用了错误的工具(Recyclerview)吗?如何最好地实现我想要的行为? (我可能可以执行Linearlayouts / constraintlayout使其工作,但我想应该有一种简单的方法可以让我丢失)

1 个答案:

答案 0 :(得分:0)

将其发布为部分自我回答,因为它可以工作,但不是最佳选择。乐意接受一个概述了更正确的方法的答案。

在适配器绑定上使用以下代码调整适配器视图的大小:

val containerSize = itemView.resources.getDimension(R.dimen.grid_size)
itemView.layoutParams.height = (containerSize / size).toInt()
itemView.layoutParams.width = (containerSize / size).toInt()

size是行数/列数。提供我想要的行为(尽管size不能平均划分grid_size时有一些伪像)