GridView内のスクロールを無効にしたい

ScrollViewの中で、GridViewを使いたい

画面全体がScrollViewのところに、GridViewを配置したいとします。

このとき、GridViewは、android:layout_height="wrap_content" という設定をすると、1行分だけが画面上に表示され、2行目以降はスクロールをすることで、見られるようになります。

そもそも、ScrollViewの中にScrollできるUIを置くことが推奨されていないし、なにより、最初からGridViewの中身を展開して、表示したい。

でも、Androidに用意されている標準の GridView では、それができない。

(ちなみにiOSのUICollectionViewも似たような感じらしい)

そのため、自力でGridViewを拡張したクラスを書くことになります。

#onMeasureをOverrideせよ

解決策は、ここにも書いてあるのですが、日本語で説明することに意義がありそうだったので、書きますね。

public class ExpandableHeightGridView extends GridView {

    public ExpandableHeightGridView(Context context) {
        super(context);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);

        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
}

こんな感じで、 GridViewonMeasure をオーバーライドしてあげればOK。 拡張したクラスを作らずとも、なんとかならないかと調べてみたのですが、結局この形に落ち着きました。。

このクラスを作った上で

<com.example.yourapp.ExpandableHeightGridView
    ....
    .... />

ってな具合に、GridViewに追加する属性と同じ手際で書いていけばOK!

おまけ

https://github.com/tanukiti1987/ExpandedViews

こちらに今回のソースコードと、GridViewではなくScrollView版のコードも載せています。 ご参考まで。

Related Posts