【问题标题】:GridView - sometimes rows are top-aligned, sometimes they're bottom-aligned!GridView - 有时行是顶部对齐的,有时它们是底部对齐的!
【发布时间】:2010-11-05 12:57:53
【问题描述】:

我正在使用 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]

所以即使第三个元素有 2 行文本,顶部也是对齐的,这是完美的。如果我将此行滚动到屏幕之外,然后再打开,它看起来像这样:

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

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

谢谢

【问题讨论】:

  • 我现在能想到的就是在所有字符串中添加空格以等于我的数据集中最长字符串的长度。由于字体是等宽的(我认为),所以一切都应该再次正确对齐。这太疯狂了!
  • 如果您已经找到请分享答案。
  • @user291701 你有没有找到答案,我自己也在苦苦挣扎

标签: android


【解决方案1】:

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

  1. 为 TextView 指定高度
  2. 使用android:singleLine="true" 使 TextView 成为单行
  3. 如果您必须在某些项目中有 2 行,则使所有项目都有 2 行。你可以这样做android:minLines="2"

【讨论】:

  • 谢谢。很好的解释。这对我帮助很大。
  • @RogerGarzonNieto 你最后做了什么?我真的很讨厌每次都强迫我的 textview 有 2 行。我敢肯定让gridview中的每个子项都对齐到顶部应该很简单
  • 你也可以简单地做android:lines="2"。如果其中一项超过 2 行,这可以防止可能出现的问题(这将被截断,但这是一个不同的问题!)。
  • minLines = 2 不起作用。我明白你的意思,但它不起作用
  • 即使是固定高度也会错位 2 行。
【解决方案2】:

在您的LinearLayout 中尝试android:layout_gravity="top"

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

【讨论】:

  • 啊,这两种方法都不行。滚动回视图时仍将行底部对齐。
  • 另一件事是,当向上和向下滚动时,滚动条的计算会变得混乱——gridview 会突然让你无限滚动,所以你最终会看到一个空白的画布。尝试向后滚动失败。这真是奇怪的行为,我认为这是 GridView 中的一个错误。
  • @user291701:如果您认为这是一个错误,请创建一个示例项目来演示该行为,并将其与解释一起发布到b.android.com。如果您想到了,请在此处添加指向该问题的链接。
  • 好的,会做的。现在我只设置 textview::lines=2。这使每个元素具有相同的高度并且似乎可以工作。
  • 我也遇到了您提到的关于在您向上/向下滚动时屏幕变黑的问题。我通过向网格适配器添加视图支架来修复它。
【解决方案3】:

有些设备不适合风格。

    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;
    }

【讨论】:

    【解决方案4】:

    如果你使用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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2018-02-09
      相关资源
      最近更新 更多