【问题标题】:GridView behaviour incorrectGridView 行为不正确
【发布时间】:2014-06-28 03:29:01
【问题描述】:

目前我正在尝试使用 GridView 创建一个图像列表,其下方有一个 textview,布局应该尽可能多地适应它们的宽度。

当使用 GridView 时:

<GridView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/gridView"
    android:numColumns="auto_fit"
    android:layout_gravity="center_horizontal|top"
    android:clickable="false"
    />

预期的行为是列会自动包装内容并在宽度上尽可能多地容纳项目?

grid item layout里面的textview都设置为wrap_content,除了ImageView,它的静态宽度是75dip。

我看到以下代码的布局:

XX

XX

XX

如果专门设置了列宽,我很容易得到:

XXXX

XXXX

XXXX

【问题讨论】:

  • gridView 列的宽度应该与 gridview 列内的最大尺寸内容相匹配(如果找到的话),并在其后跟上其余的内容。
  • 确定单元格内容最大宽度的唯一方法是实例化和填充网格中的所有单元格并测量它们,这是一项非常繁重的操作,基本上使视图虚拟化(只绘制可见)无用。

标签: android gridview layout


【解决方案1】:

我认为你应该做的是测量gridview的列宽

public int measureCellWidth( Context context, View cell )
{

    // We need a fake parent
    FrameLayout buffer = new FrameLayout( context );
    android.widget.AbsListView.LayoutParams layoutParams = new  android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    buffer.addView( cell, layoutParams);

    cell.forceLayout();
    cell.measure(1000, 1000);

    int width = cell.getMeasuredWidth();

    buffer.removeAllViews();

    return width;
}

然后用

设置
gridView.setColumnWidth(width);

你也应该阅读这个Android: How does GridView auto_fit find the number of columns?

【讨论】:

  • 可以忽略不计,用户没有机会注意到任何事情,即使在较弱的手机上也是如此。你真的应该尝试一下,不管有没有,然后自己看看结果:)
  • 这仅测量一个视图的宽度。我认为 JamieB 想要测量所有视图以确定最大宽度;在这种情况下,许多项目的性能远不能忽略不计。
【解决方案2】:

如果您将android:numColumns 设置为auto_fit,您还需要设置android:columnWidth 以便GridView 能够计算可以容纳多少项目。 GridView 在知道它可以在一行中容纳多少个项目视图之前不会创建任何项目视图,并且它不会测量项目视图。

如果您使用auto_fit,您应该始终能够提前确定项目的宽度。如果不是,则意味着您的项目可能具有不同的宽度,在这种情况下,您的项目将无法正确呈现,因为 GridView 中的列始终具有相同的大小。

【讨论】:

  • 我担心会是这种情况,我想我只需要坚持静态宽度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2021-04-25
  • 2013-08-17
相关资源
最近更新 更多