GridView - 有时行是顶部对齐的,有时它们是底部对齐的!

时间:2010-11-05 12:57:54

标签: android

我正在使用GridView。一列中的四个项目。每个元素由以下布局组成:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical">

  <ImageView
    android:layout_width="32dip"
    android:layout_height="32dip"/>

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="11dip"
    android:paddingTop="2dip" />
</LinearLayout>

因此每个元素都是一个小图像,下面有一些文字。布局在第一次通过时效果很好。但是,如果项目的文本很长,它会换行到两行。这可以正常工作,直到您将其滚入和移出视图。默认情况下,一行中的所有图像都是顶部对齐的。当您在屏幕外滚动一行,然后返回屏幕时,您会看到该行以某种方式得到底部对齐。它看起来像:

第一个布局:

[image]   [image]   [image]  
[text]    [text]    [text
                     wrap]

所以即使第三个元素有两行文字,顶部也是对齐的,这是完美的。如果我在屏幕上滚动此行,然后重新打开,它看起来像这样:

                    [image]
[image]   [image]   [text
[text]    [text]     wrap]

所以这行在底部对齐。我不确定这是否是GridView中的错误,或者是否有某种方法可以控制布局以始终对齐行。我已经尝试将元素布局的重力设置为“顶部”,没有好处。似乎GridView也没有任何独特的设置来控制它。有什么想法吗?

由于

4 个答案:

答案 0 :(得分:14)

GridView中项目的高度必须相同。你有2或3个选择。

  1. 为TextView
  2. 指定高度
  3. 使用android:singleLine="true"
  4. 创建TextView单行
  5. 如果某些项目中必须有2行,请使所有项目都有2行。您可以执行此操作android:minLines="2"

答案 1 :(得分:0)

android:layout_gravity="top"中尝试LinearLayout

此外,如果您手动为单元格的布局充气,请务必使用inflate()作为第二个参数的GridView版本,并对第三个参数使用false。

答案 2 :(得分:0)

有些设备不适合风格。

    grid.setColumnWidth(90);
    grid.setNumColumns(GridView.AUTO_FIT);
    grid.setVerticalSpacing(10);
    grid.setHorizontalSpacing(10);
    grid.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
    grid.setGravity(Gravity.CENTER);
    grid.setOnItemClickListener(this);

<style name="GridViewStyle" parent="@android:style/Widget.GridView">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">fill_parent</item>
        <item name="android:columnWidth">90dp</item>
        <item name="android:numColumns">auto_fit</item>
        <item name="android:verticalSpacing">10dp</item>
        <item name="android:horizontalSpacing">10dp</item>
        <item name="android:stretchMode">columnWidth</item>
        <item name="android:gravity">center</item>
    </style>

//看看我的适配器如何返回textview
//我有顺序麻烦你只需要刷新适配器(onResume或方向改变)

public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView!=null) return convertView;

        Intent intent = (Intent) getItem(position);
        TextView tv = new TextView(mContext);
        tv.setGravity(Gravity.CENTER_HORIZONTAL);
        tv.setText(intent.getStringExtra("text"));

        try {
            tv.setCompoundDrawablesWithIntrinsicBounds(null, mContext.getPackageManager().getActivityIcon(intent), null, null);
        } catch (NameNotFoundException e) {
            tv.setCompoundDrawablesWithIntrinsicBounds(0, android.R.drawable.ic_secure, 0, 0);
        }

        return tv;
    }

答案 3 :(得分:0)

如果您使用的是 getview 方法,则可以动态设置其高度/宽度,不需要采用相同大小的所有元素。它将自动从中心动态裁剪图像。

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = new ImageView(mContext);
        imageView.setImageResource(mThumbIds[position]);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); //it will crop the image from center
        imageView.setLayoutParams(new GridView.LayoutParams(70, 70));
        return imageView;
    }

还要在xml中设置所需的列数

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="2"          // set the number of coloums
    android:columnWidth="90dp"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="10dp"
    android:gravity="center"
    android:stretchMode="columnWidth" >  
</GridView>