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();
}
}
こんな感じで、 GridView
の onMeasure
をオーバーライドしてあげればOK。
拡張したクラスを作らずとも、なんとかならないかと調べてみたのですが、結局この形に落ち着きました。。
このクラスを作った上で
<com.example.yourapp.ExpandableHeightGridView
....
.... />
ってな具合に、GridViewに追加する属性と同じ手際で書いていけばOK!
おまけ
https://github.com/tanukiti1987/ExpandedViews
こちらに今回のソースコードと、GridViewではなくScrollView版のコードも載せています。 ご参考まで。