如何把GridView放入ScrollView

我必须devise布局,使整个布局应该滚动和内部布局,我必须在Gridforms显示相关内容,所以我决定使用GridView 。但问题是,我无法使用ScrollView里面的GridView我已阅读文档(文档也说我们不应该在ScrollView使用GridView )。但我必须这样做,所以任何请给我一些这个想法。谢谢

除了固有的滚动之外,GridView确实有好处。 例如,一个一致的,dynamic的单元格布局,将根据您传入的数据进行扩展和收缩。 所以,当人们说这样的function并不好时,我认为这是错误的,因为你可能想在图像(视图)的dynamic网格内滚动视图,但希望整个滚动视图包含其他东西,而不仅仅是网格细胞。

现在,这里是你如何做到这一点。 在这里检查答案。 这是一个可扩展的高度GridView,你将要在你的项目中导入/创build。 这基本上意味着,随着更多的项目被添加到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中使用其上方或下方的其他视图元素,并使其全部滚动。

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

我知道我迟到了,但我还有另一个我必须分享的解决scheme,而且完美无瑕。 在这里,该方法根据其包含的项目数来计算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); } 

在你的gridview上调用setAdapter后,只需调用

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

它会工作。

你可以像平常一样在你的xml中定义gridview

并让代码照顾它。 🙂

我发现了一种在ScrollView中GridView一个固定大小的方法,并且可以滚动它。 这可以让你看到整个ScrollView而不必滚动GridView的所有元素,使用ExpandableHeightGridView对我来说更有意义。

为此,您将不得不实现一个扩展GridView的新类并重写onTouchEvent()来调用requestDisallowInterceptTouchEvent(true) 。 因此,父视图将离开网格拦截触摸事件。

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); 

我希望它有助于=)

要在scrollview中使用gridview,请设置scrollview android:fillViewport =“true”

我知道它迟到了,但可能对一些新开发者有用。

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

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

scrollview使用ExpandableHeightlistViewExpandableHeightGridView scrollview

我不会强迫这个问题。 GridView在scrollView中不能正常工作。 而是将您的gridview转换为recyclerview,并使用gridLayoutManager来解决问题。