69

レイアウト全体がスクロールするようにレイアウトを設計する必要があり、レイアウト内に関連するコンテンツをフォームに表示する必要があるGridため、使用することにしましGridViewた。内部では使用しないでください) また、私はこれを行う必要があります。GridViewScrollViewGridViewScrollView

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 に答える
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);
    }
}

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 をオーバーライドしますが、performClick はオーバーライドしません」という厄介な警告があります。必要に応じて、ご自身で解決してください。

于 2014-11-10T20:33:40.863 に答える
2

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

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

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/

于 2017-09-19T07:32:19.030 に答える