69

我必须设计布局,使整个布局应该滚动和内部布局我必须以Grid形式显示相关内容,所以我决定使用GridView。但问题是我无法在GridView里面使用ScrollView我已经阅读了文档(文档也说我们应该也不能GridView在里面使用ScrollView)。但我必须这样做,所以任何人都可以给我一些想法。谢谢

4

11 回答 11

115

除了固有的滚动之外,GridView 肯定有好处。例如,单元格的一致动态布局将根据您传入的数据进行扩展和收缩。因此,当人们说想要这样的功能不好时,我认为这是错误的,因为您可能希望在滚动视图中使用动态图像(视图)网格,但希望整个滚动视图包含除网格之外的其他内容细胞。

现在,您可以这样做。在这里检查答案。它是一个可扩展高度的 GridView,您需要在项目中导入/创建它。这基本上意味着随着更多项目添加到 GridView,它只会扩展其高度,而不是保持其高度设置并使用滚动。这正是你想要的。

在项目中拥有 ExpandableHeightGridView 后,转到您希望 GridView 所在的 XML 布局。然后你可以做这样的事情(释义):

<ScrollView ...>
    <RelativeLayout ...>
        <com.example.ExpandableHeightGridView ... />
        <other view items />
    </RelativeLayout>
</ScrollView>

然后,在您设置 GridView 适配器的活动中,您要确保将其设置为展开。所以:

ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);

您想要这个可扩展的 GridView 的原因是,标准 GridView 不扩展的事实是导致它滚动的原因。它固定在某个高度,然后随着更多项目填充它超出其视图边界,它变得可滚动。现在,有了这个,您的 GridView 将始终扩展其高度以适应其中的内容,因此永远不允许它进入其滚动模式。这使您可以在 ScrollView 中使用它,并在 ScrollView 中使用它上方或下方的其他视图元素,并让它们全部滚动。

这应该会给你你正在寻找的结果。如果您有任何问题,请告诉我。

于 2012-10-12T12:58:48.483 回答
35

我知道我迟到了,但我有另一个解决方案,我必须分享它并且可以完美运行。此处,该方法根据其包含的项目数计算 GridView 高度,并在运行时将高度设置为 GridView。

public void setGridViewHeightBasedOnChildren(GridView gridView, int columns) {
        ListAdapter listAdapter = gridView.getAdapter(); 
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        int items = listAdapter.getCount();
        int rows = 0;

        View listItem = listAdapter.getView(0, null, gridView);
        listItem.measure(0, 0);
        totalHeight = listItem.getMeasuredHeight();

        float x = 1;
        if( items > columns ){
            x = items/columns;
            rows = (int) (x + 1);
            totalHeight *= rows;
        }

        ViewGroup.LayoutParams params = gridView.getLayoutParams();
        params.height = totalHeight;
        gridView.setLayoutParams(params);

}

调用setAdaptergridview 后,只需调用

setGridViewHeightBasedOnChildren( <yourGridView> , <no of grid view columns> )

它会起作用的。

您可以像往常一样在 xml 中定义 gridview

让代码来处理它。:)

于 2014-03-21T10:18:35.053 回答
10

我找到了一种在 ScrollView中为GridView提供固定大小并启用滚动的方法。这使您无需滚动 GridView 的所有元素即可查看整个 ScrollView,对我来说,使用ExpandableHeightGridView更有意义。

为此,您必须实现一个扩展 GridView 的新类并覆盖onTouchEvent()以调用requestDisallowInterceptTouchEvent(true)。因此,父视图将离开 Grid 拦截触摸事件。

GridViewScrollable.java:

package com.example;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.GridView;

public class GridViewScrollable extends GridView {

    public GridViewAdjuntos(Context context) {
        super(context);
    }

    public GridViewAdjuntos(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public GridViewAdjuntos(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev){
        // Called when a child does not want this parent and its ancestors to intercept touch events.
        requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(ev);
    }
}

在 ScrollView 内将其添加到您想要的特征和边距的布局中:

<ScrollView 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"
android:isScrollContainer="true" >

    <com.example.GridViewScrollable
    android:id="@+id/myGVS"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth" />

</ScrollView>

在你的活动中得到它:

GridViewScrollable myGridView = (GridViewScrollable) findViewById(R.id.myGVS);

我希望它有帮助 =)

在科特林:

class GridViewScrollable @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : GridView(context, attrs, defStyleAttr) {

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        // Called when a child does not want this parent and its ancestors to intercept touch events.
        requestDisallowInterceptTouchEvent(true)
        return super.onTouchEvent(ev)
    }
}

有一个烦人的警告:“自定义视图 GridViewScrollable 覆盖 onTouchEvent 但不执行单击”。如果你愿意,请自行解决。

于 2014-11-10T20:33:40.863 回答
9

我还试图GridViewNestedScrollView.

这个对另一个问题的回答帮助了我:https ://stackoverflow.com/a/38612612

将您的 GridView 属性启用为

android:nestedScrollingEnabled="true"

原始海报:Droid_Dev

于 2018-05-18T16:44:52.897 回答
5

要在滚动视图中使用 gridview,请设置滚动视图 android:fillViewport="true"

我知道在这里回答很晚,但可能对一些新开发人员有用。

于 2016-08-01T11:43:34.743 回答
2

如果您使用了 dennisdrew 的答案并且您的网格上方有内容并且当您打开视图时它会被隐藏,只需添加下面的最后一行

ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
gridView.setFocusable(false);
于 2016-08-07T21:08:49.353 回答
1

最好使用ExpandableHeightlistViewExpandableHeightGridViewinside scrollview

逻辑

通过提供非常大的高度提示来计算整个高度。但不要使用该整数的最高 2 位;这些是为 MeasureSpec 模式保留的。

int expandSpec = MeasureSpec.makeMeasureSpec(
 Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
 super.onMeasure(widthMeasureSpec, expandSpec);

 ViewGroup.LayoutParams params = getLayoutParams();
 params.height = getMeasuredHeight();

有关更多信息,请使用演示探索以下示例

http://www.londatiga.net/it/programming/android/make-android-listview-gridview-expandable-inside-scrollview/

于 2017-09-19T07:32:19.030 回答
1

我不会强迫这个问题。GridView 在滚动视图中无法正常工作。而是将您的 gridview 转换为 recyclerview 并使用 gridLayoutManager 来解决问题。

于 2017-10-09T17:56:33.417 回答
1

相信这个解决方案对我有用!

机器人:nestedScrollingEnabled="真"

上面的网格视图内的代码可以滚动网格视图并设置宽度和高度 android:layout_width="match_parent" android:layout_height="200sp"

这甚至在滚动视图中也可以工作感谢以前的答案我想出了以前的答案。感谢他们

于 2020-10-21T15:17:46.760 回答
0
 gridView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    return false;
                }

            });

// 设置 Touch Listener 以处理 ScrollView 内部的触摸

于 2019-09-26T23:46:00.823 回答
0

如果你想在GridView里面ScrollView/ RecyclerView,有两种情况:

  1. 如果您希望GridView所有行都可见,请参阅https://stackoverflow.com/a/63724794/2914140

  2. 如果您想在 中显示一行GridView,但能够滚动它(以显示其他行),请参阅https://stackoverflow.com/a/26852498/2914140

于 2020-09-03T13:53:06.513 回答