如何将GridView放在ScrollView中

时间:2012-10-12 12:37:37

标签: android gridview scrollview

我必须设计布局,使整个布局滚动,内部布局我必须以Grid形式显示相关内容,所以我决定使用GridView。但问题是我无法在GridView内使用ScrollView我已阅读文档(文档也说我们不应在GridView内使用ScrollView)。但我必须这样做,所以请任何请让我对此有所了解。谢谢

11 个答案:

答案 0 :(得分:107)

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

现在,您可以通过以下方式进行操作。检查答案here。它是一个可扩展的高度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中使用其上方或下方的其他视图元素,并将它们全部滚动。

这应该可以为您提供所需的结果。如果您有任何问题,请告诉我。

答案 1 :(得分:32)

我知道我迟到了,但我有另一种解决方案,我必须分享,哪种方式完美无瑕。这里,该方法根据它包含的项目数计算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

让代码处理它。 :)

答案 2 :(得分:10)

我找到了一种方法,可以将 GridView 固定大小放在ScrollView 中,然后启用滚动。这允许您在不必滚动GridView的所有元素的情况下查看整个ScrollView,使用 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);

我希望它有帮助=)

答案 3 :(得分:2)

要在scrollview中使用gridview,请设置scrollview android:fillViewport =&#34; true&#34;

我知道它在这里回答的时间较晚,但可能对一些新开发者有用。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

最好在ExpandableHeightlistView内使用ExpandableHeightGridViewscrollview

<强>逻辑

通过提供非常大的高度提示来计算整个高度。但是不要使用这个整数的最高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/

答案 6 :(得分:1)

我还希望在嵌套滚动视图中滚动网格视图。

关于另一个问题的答案帮助了我:https://stackoverflow.com/a/38612612

  

启用GridView属性

android:nestedScrollingEnabled="true"

原创海报:Droid_Dev

答案 7 :(得分:0)

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

答案 8 :(得分:0)

 gridView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    return false;
                }

            });

//在Touch Listener上进行设置,以处理ScrollView内部的触摸

答案 9 :(得分:0)

如果您想在GridView / ScrollView中使用RecyclerView,则有两种情况:

  1. 如果要使GridView的所有行都可见,请参见https://stackoverflow.com/a/63724794/2914140

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

答案 10 :(得分:0)

相信此解决方案对我有用!

android:nestedScrollingEnabled =“ true”

上方网格视图中的代码可滚动gridview 并设置宽度和高度 android:layout_width =“ match_parent” android:layout_height =“ 200sp”

即使在scrollview中也可以使用 感谢您之前的回答,我已经为之前的答案弄清楚了。 多亏了他们