我有一个自定义网格视图,其中包含类似
的项目<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:gravity="center"
android:longClickable="false"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:longClickable="false"
android:text="0"
android:textSize="60sp" />
</LinearLayout>
我希望我的项目是正方形,我希望gridview拉伸宽度以纵向填充所有宽度的屏幕,横向填充所有高度。 它看起来应该是这样的
其中A - 是正方形的边,B是边距宽度(可以是零)。 我认为我应该覆盖onMeasure方法,但究竟应该怎么做? 也许有人可以帮忙吗?
EDIT 好吧,我尝试在适配器的getView方法中手动设置项目的宽度和高度,它更好,但它仍然不是我想要的。如何摆脱列之间的间距?
答案 0 :(得分:2)
首先,您需要创建一个自定义View类,而不是您正在使用的默认LinearLayout。然后你想要覆盖View的onMeasure调用,并强制它为方形:
public class GridViewItem extends ImageView {
public GridViewItem(Context context) {
super(context);
}
public GridViewItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GridViewItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec); // This is the key that will make the height equivalent to its width
}
}
然后,您可以将row_grid.xml文件更改为:
<path.to.item.GridViewItem xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/ic_launcher" >
</path.to.item.GridViewItem>
请务必更改&#34; path.to.item&#34;到GridViewItem.java类所在的包。
编辑:
还将scaleType从fitXY更改为centerCrop,以便您的图像不会拉伸自身并保持其纵横比。并且,只要它是方形图像,无论如何都不应该裁剪。
答案 1 :(得分:-1)
因此,您需要GridView
适合stretchMode="columnWidth"
和stretchMode="rowWidth"
的屏幕。不幸的是,最后一个不是真正的属性,你实际上需要在运行时进行这个计算,正如Sherif elKhatib建议的那样。
GridView可以自动适合屏幕和拉伸列。
<GridView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchMode="columnWidth" />
所以我们只需要拉伸行。我们可以做的,通过计算当我们知道GridView和rowsCount的高度时应该有多少rowHeight。
public class YourAdapter extends BaseAdapter {
int rowsCount;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if (itemView == null) {
itemView = layoutInflater.inflate(R.layout.item_view, parent, false);
int height = parent.getHeight();
if (height > 0) {
LayoutParams layoutParams = itemView.getLayoutParams();
layoutParams.height = (int) (height / rowsCount);
} // for the 1st item parent.getHeight() is not calculated yet
}
}
}