GridView中的方形项目,具有自适应宽度/高度

时间:2013-10-31 16:41:00

标签: android gridview

我有一个自定义网格视图,其中包含类似

的项目
<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拉伸宽度以纵向填充所有宽度的屏幕,横向填充所有高度。 它看起来应该是这样的 layout

其中A - 是正方形的边,B是边距宽度(可以是零)。 我认为我应该覆盖onMeasure方法,但究竟应该怎么做? 也许有人可以帮忙吗?

EDIT 好吧,我尝试在适配器的getView方法中手动设置项目的宽度和高度,它更好,但它仍然不是我想要的。如何摆脱列之间的间距?

enter image description here

2 个答案:

答案 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       
       }
   }
}