web-dev-qa-db-ja.com

GridViewをScrollView内に配置する方法

レイアウト全体をスクロールするようにレイアウトを設計する必要があり、内部レイアウトはGrid形式で関連コンテンツを表示する必要があるため、GridViewを使用することにしました。しかし、問題は使用できないことですGridView inside ScrollView私もドキュメントを読みました(ドキュメントはGridView内でScrollViewを使用すべきでないと言っています)。しかし、私はこれをしなければなりません。これについてのアイデアを教えてください。ありがとう

65
Dilip

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内で上下にある他のビュー要素を使用したり、すべてをスクロールさせることができます。

これにより、探している結果が得られます。ご質問があればお知らせください。

108
dennisdrew

私は遅れていることは知っていますが、共有する必要があり、完璧に機能する別のソリューションがあります。ここで、このメソッドは、含まれる項目の数に基づいて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);

}

グリッドビューでsetAdapterを呼び出した後、単に呼び出します

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

そしてそれは動作します。

通常のように、xmlでgridviewを定義できます

コードにそれを任せてください。 :)

32
Vikram Gupta

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

私はそれが役立つことを願っています=)

10
Lionel T.

Scrollview内でgridviewを使用するには、scrollview Android:fillViewport = "true"を設定します

私はここで答えるのが遅いことを知っていますが、いくつかの新しい開発者にとって役に立つかもしれません。

また、ネストされたスクロールビュー内でグリッドビューをスクロール可能にすることも検討していました。

別の質問に関するこの回答は私を助けました: https://stackoverflow.com/a/38612612

GridViewプロパティを次のように有効にします

Android:nestedScrollingEnabled="true"

元のポスター: Droid_Dev

2
Stephen Emery

Dennisdrewの回答を使用していて、グリッドの上にコンテンツがあり、ビューを開くと非表示になる場合は、下の最後の行を追加するだけです

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

ExpandableHeightlistView内でExpandableHeightGridViewまたは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/

1
Kishore Reddy

私は問題を強制しません。 GridViewはscrollViewではうまく機能しません。代わりに、gridviewをrecyclerviewに変換し、gridLayoutManagerを使用して問題を解決します。

0
j2emanue