如何将GridView放在ScrollView中

Dil*_*lip 65 android gridview scrollview

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

den*_*rew 108

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

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

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

<ScrollView ...>
    <RelativeLayout ...>
        <com.example.ExpandableHeightGridView ... />
        <other view items />
    </RelativeLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)

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

ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
Run Code Online (Sandbox Code Playgroud)

您希望这个可扩展的GridView的原因是,标准GridView不扩展的事实是导致它滚动的原因.它坚持一定的高度,然后随着更多的项目填充它超过其视图边界,它变得可滚动.现在,通过这个,您的GridView将始终扩展其高度以适应其中的内容,从而永远不允许它进入其滚动模式.这使您可以在ScrollView中使用它并在ScrollView中使用其上方或下方的其他视图元素,并将它们全部滚动.

这应该会给你你想要的结果.如果您有任何疑问,请告诉我.

  • 你在这个答案中提出的建议是否违背了"GridView"的要点.你的应用程序内存不足,性能会受到很大影响.解决方案是使用页眉或页脚视图,就像使用普通的`ListView`一样.本机`GridView`可能不支持页眉或页脚视图,但有[**自定义实现,如此**](https://github.com/maurycyw/HeaderGridView).使用其中之一,您可以获得相同的效果,而不会丢失视图回收.像你提议的黑客可能会解决问题,但它们只会在以后引起更严重的问题. (8认同)
  • 这种方法的问题在于您丢失了网格视图为您提供的性能优化,即.回收电网项目. (7认同)

Vik*_*pta 33

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

}
Run Code Online (Sandbox Code Playgroud)

在调用setAdaptergridview后,只需调用即可

setGridViewHeightBasedOnChildren( <yourGridView> , <no of grid view columns> )
Run Code Online (Sandbox Code Playgroud)

它会工作的.

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

并让代码处理它.:)

  • @vickey如果项目的数量完全填满行数,你计算的高度有1个额外的行 (2认同)

Lio*_* T. 10

我找到了一种方法,在ScrollView中GridView提供固定大小,并启用滚动它.这允许您在不必滚动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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

并在你的活动中得到它:

GridViewScrollable myGridView = (GridViewScrollable) findViewById(R.id.myGVS);
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助=)


Ste*_*ery 8

我还试图GridViewNestedScrollView.

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

启用您的 GridView 属性作为

android:nestedScrollingEnabled="true"
Run Code Online (Sandbox Code Playgroud)

原海报:Droid_Dev


小智 5

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

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