GridViewの行の高さに関するあらゆる種類の問題が発生しています。
XMLでアイテムのサイズ(高さ/幅)を設定し、GridViewにストレッチなしでできるだけ多くのアイテムを自動適合させたいと思います。次の要素に収まらない場合は、収まる要素の現在の数の周りにパディングを追加するだけです。
現在、2つの列(ほとんど固定サイズのように見えます)が表示され、行が引き伸ばされます。誰かが何が起こっているのか、私が望むものを達成する方法を説明してもらえますか?
グリッドビュー:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/main_grid"
Android:numColumns="auto_fit"
Android:gravity="center"
Android:paddingRight="20dp"
Android:paddingLeft="20dp"
Android:clipToPadding="true"
Android:fitsSystemWindows="true"
Android:stretchMode="none"
Android:background="@drawable/main_grid_background">
</GridView>
GridItem(後で完全な正方形でない場合は奇妙に見える背景画像を挿入するため、320x320が必要です)。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="320dp"
Android:layout_height="320dp"
Android:padding="10dp" >
<TextView
Android:id="@+id/grid_item_label"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:singleLine="true"
Android:text="@+id/label"
Android:layout_marginTop="5dp"
Android:textColor="@color/black"
Android:textSize="15sp"
Android:visibility="invisible"
Android:layout_centerInParent="true" >
</TextView>
</RelativeLayout>
Java:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(context);
// get layout from mobile.xml
gridView = inflater.inflate(R.layout.main_grid_item, null);
} else {
gridView = (View) convertView;
}
TextView textView = (TextView) gridView
.findViewById(R.id.grid_item_label);
//SET TEXT AND BACKGROUND IMAGE HERE
//gridView.setBackgroundResource(R.drawable.main_grid_item_import);
return gridView;
}
だから、これは完璧な答えではありませんが、これは私がそれを機能させる方法です。 this スレッドから借りたアイデア。
これらはすべて、320x320の画像サイズを知っていることを前提としています。また、GridViewでAndroid:columnWidth="320dp"
を設定する必要がありました。そうしないと機能しませんでした。誰かがより良いアイデアを持っている場合、それを投稿してください...今のところ私は先に進んでいます。
グリッドアイテムXML:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="10dp" >
<ImageView
Android:id="@+id/grid_item_image"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerInParent="true"/>
<TextView
Android:id="@+id/grid_item_label"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:singleLine="true"
Android:text="@+id/label"
Android:textColor="@color/black"
Android:layout_alignLeft="@+id/grid_item_image"
Android:layout_alignTop="@+id/grid_item_image"
Android:layout_alignRight="@+id/grid_item_image"
Android:layout_alignBottom="@+id/grid_item_image"
Android:gravity="center"
Android:textSize="15sp"
Android:visibility="invisible">
</TextView>
</RelativeLayout>
GridView XML:
<GridView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/main_grid"
Android:numColumns="auto_fit"
Android:gravity="center"
Android:columnWidth="320dp"
Android:paddingRight="20dp"
Android:paddingLeft="20dp"
Android:clipToPadding="true"
Android:fitsSystemWindows="true"
Android:stretchMode="columnWidth"
Android:background="@drawable/main_grid_background">
</GridView>
CustomAdapterで
v.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, rowHigh));
rowHighは、変更する必要があるディメンションです
public class MyGridView extends GridView {
public MyGridView(Context context) {
super(context);
}
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSpec;
if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
// The great Android "hackatlon", the love, the magic.
// The two leftmost bits in the height measure spec have
// a special meaning, hence we can't use them to describe height.
heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
} else {
heightSpec = heightMeasureSpec;
}
super.onMeasure(widthMeasureSpec, heightSpec);
}
}
XMLの場合
<MyGridView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/main_grid"
Android:gravity="center"/>