グリッドビュー内に8つのアイテムを表示しようとしています。残念ながら、グリッドビューの高さは常に小さすぎるため、最初の行と2番目の行の一部のみが表示されます。
Android:layout_height="300dp"
を設定すると動作します。 wrap _content
およびfill_parent
は明らかにそうではありません。
私のグリッドビュー:
<GridView
Android:id="@+id/myId"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:horizontalSpacing="2dp"
Android:isScrollContainer="false"
Android:numColumns="4"
Android:stretchMode="columnWidth"
Android:verticalSpacing="20dp" />
私のアイテムのリソース:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
Android:minHeight="?android:attr/listPreferredItemHeight" >
<ImageView
Android:id="@+id/appItemIcon"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:src="@Android:drawable/ic_dialog_info"
Android:scaleType="center" />
<TextView
Android:id="@+id/appItemText"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="My long application name"
Android:gravity="center_horizontal"
Android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
この問題は、垂直方向のスペースの不足とは関係がないようです。
私に何ができる ?
(あまりにも)研究した後、私はつまずいた Neil Traftの優れた答え 。
GridView
に彼の作品を適応させるのは簡単です。
ExpandableHeightGridView.Java:
package com.example;
public class ExpandableHeightGridView extends GridView
{
boolean expanded = false;
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);
}
public boolean isExpanded()
{
return expanded;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// HACK! TAKE THAT Android!
if (isExpanded())
{
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
else
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public void setExpanded(boolean expanded)
{
this.expanded = expanded;
}
}
次のようにレイアウトに含めます。
<com.example.ExpandableHeightGridView
Android:id="@+id/myId"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:horizontalSpacing="2dp"
Android:isScrollContainer="false"
Android:numColumns="4"
Android:stretchMode="columnWidth"
Android:verticalSpacing="20dp" />
最後に、拡張を依頼するだけです。
mAppsGrid = (ExpandableHeightGridView) findViewById(R.id.myId);
mAppsGrid.setExpanded(true);
@taconeからの回答を使用し、それが機能することを確認した後、コードの短縮を試みることにしました。これが私の結果です。 PS:これは、taconesのブール値の「expanded」を常にtrueに設定することに相当します。
public class StaticGridView extends GridView {
public StaticGridView(Context context) {
super(context);
}
public StaticGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public StaticGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST));
getLayoutParams().height = getMeasuredHeight();
}
}
私のために働いた別の同様のアプローチは、1行の高さを計算し、静的データ(ページネーションに適応させることができます)を使用して、行数を計算し、GridViewの高さを簡単に変更できます。
private void resizeGridView(GridView gridView, int items, int columns) {
ViewGroup.LayoutParams params = gridView.getLayoutParams();
int oneRowHeight = gridView.getHeight();
int rows = (int) (items / columns);
params.height = oneRowHeight * rows;
gridView.setLayoutParams(params);
}
アダプターを設定した後、GridViewが描画されるか、高さ= 0になる場合に、このコードを使用します。
gridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (!gridViewResized) {
gridViewResized = true;
resizeGridView(gridView, numItems, numColumns);
}
}
});
見つけられたタコンの答えが役に立ちました...だからC#(Xamarin)に移植しました
public class ExpandableHeightGridView: GridView
{
bool _isExpanded = false;
public ExpandableHeightGridView(Context context) : base(context)
{
}
public ExpandableHeightGridView(Context context, IAttributeSet attrs) : base(context, attrs)
{
}
public ExpandableHeightGridView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
{
}
public bool IsExpanded
{
get { return _isExpanded; }
set { _isExpanded = value; }
}
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// HACK! TAKE THAT Android!
if (IsExpanded)
{
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.MakeMeasureSpec( View.MeasuredSizeMask, MeasureSpecMode.AtMost);
base.OnMeasure(widthMeasureSpec,expandSpec);
var layoutParameters = this.LayoutParameters;
layoutParameters.Height = this.MeasuredHeight;
}
else
{
base.OnMeasure(widthMeasureSpec,heightMeasureSpec);
}
}
}
AT_MOSTの高さを計算して、on measureに設定するだけです。ここでは、GridView Scrollは機能しません。垂直スクロールビューを明示的に使用する必要があります。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSpec;
if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
heightSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
}
else {
// Any other height should be respected as is.
heightSpec = heightMeasureSpec;
}
super.onMeasure(widthMeasureSpec, heightSpec);
}