如何使GridView在Kotlin中包装其所有子视图

时间:2019-06-21 15:40:00

标签: android gridview kotlin grid adapter

我想以网格形式动态地对卡布局进行分组,但是我不确定是否要使用GridViewGridLayout来进行分组。 由于子视图是动态添加的,因此我不知道行数或列数,因此无法使用GridLayout,但是如果我实现了GridView,则内容在滚动,我不知道想要它。

[我希望网格视图两个将所有子对象包裹起来而不显示任何滚动条

因此,我应该禁用GridView的滚动以包装其内容,或者我缺少其他地方。

我尝试使用自定义视图包装子视图。但是,即使那样也不能解决问题。

这是自定义视图类:

package ...

import ...

class WrappingGridView : GridView {

    constructor(context: Context) : super(context) {}

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {}

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {}

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        var heightSpec = heightMeasureSpec
        if (layoutParams.height == LayoutParams.WRAP_CONTENT) {
            heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE shr 2, MeasureSpec.AT_MOST)
        }
        super.onMeasure(widthMeasureSpec, heightSpec)
    }

}

所以我想知道如何将子视图包装在gridView中? 另外,我应该使用GridViewGridLayout还是其他东西?

尝试回收器视图后更新了代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              tools:context=".ShopFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="@android:color/white">

    <LinearLayout android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:orientation="vertical"
                  android:layout_marginTop="5dp">

        <TextView android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:textSize="20sp"
                  android:padding="2dp"
                  android:layout_marginLeft="5dp"
                  android:layout_marginStart="5dp"
                  style="@style/TextAppearance.AppCompat.Title"
                  android:text="Trending Tastes"
                  android:textColor="@color/colorPrimaryDark"
                  android:drawableLeft="@drawable/ic_whatshot_gradient_900_24dp"
                  android:drawableStart="@drawable/ic_whatshot_gradient_900_24dp"
                  android:drawablePadding="5dp"/>

        <HorizontalScrollView android:layout_width="match_parent"
                              android:scrollbars="none"
                              android:id="@+id/circularCardCollection"
                              android:layout_height="wrap_content">

            <LinearLayout android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:orientation="horizontal">
                <include layout="@layout/card_small_layout"/>
                <include layout="@layout/card_small_layout"/>
                <include layout="@layout/card_small_layout"/>
                <include layout="@layout/card_small_layout"/>
            </LinearLayout>
        </HorizontalScrollView>
    </LinearLayout>
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
                  android:orientation="vertical">
        <TextView android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:textSize="20sp"
                  android:padding="2dp"
                  android:layout_marginLeft="5dp"
                  android:layout_marginStart="5dp"
                  style="@style/TextAppearance.AppCompat.Title"
                  android:text=" @Treat -Must Try"
                  android:textColor="@color/colorPrimaryDark"
                  android:drawableLeft="@drawable/ic_restaurant_gradient_24dp"
                  android:drawableStart="@drawable/ic_restaurant_gradient_24dp"
                  android:drawablePadding="5dp"/>
<RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content">
    <android.support.v7.widget.RecyclerView android:layout_width="match_parent"
                                            android:layout_height="wrap_content"
                                            android:padding="10dp"
                                            android:horizontalSpacing="5dp"
                                            android:verticalSpacing="10dp"
                                            android:gravity="center"
                                            android:id="@+id/grid"/>
</RelativeLayout>


    </LinearLayout>
</LinearLayout>

在主要片段中:

   gridview.layoutManager = GridLayoutManager(view.context,2,LinearLayoutManager.VERTICAL,false)

这不能解决问题。我查看了Stack Question的解决方案,但仍然没有结果。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下库:FitGridView

否则,您可以使用Gridlayout或LinearLayout的组合,但是您需要进行大量计算,具体取决于所需卡片的最小和最大大小,行和行的卡片数目。

答案 1 :(得分:0)

我解决了这个问题。网格视图无法包装其子级,因为布局中没有ScrollView

我来自Web Designing背景,webage的基本属性是根据其内容进行滚动,但是在android中,我们必须添加ScrollView才能创建活动滚动。

只需添加一个ScrollView作为最上面的元素,它就像一个魅力!

<ScrollView  xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              tools:context=".ShopFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
        //Other Views

<GridView  android:layout_width="match_parent"
              android:layout_height="wrap_content"/>
</ScrollView>

此外RecyclerView是GridView的更新版本,因此更好地使用它。