2

我实际上有一个由自定义 ArrayAdapter 提供的 ListActivity。它构建由单个 ImageViews 组成的行。在纵向模式下,它看起来不错。但在横向模式下,它将图像拉伸到边界(我将 scaleType 设置为 fitXY)。
我想在横向模式下每行有 2 个 ImageView。GridView 是正确的布局吗?
你会怎么做?

由于我有一个 480x800 的屏幕,纵向时,ImageView 的宽度为 480 像素,而横向时,两者的宽度均为 400 像素。这不是问题,但尊重宽度/高度比对我来说很重要。

4

5 回答 5

3

你为什么不使用 Gridview 来完成你的任务。如果要使用列表视图,则必须根据方向检查方向

1)在横向模式下,将加载来自 layout-land/ 的布局,其中包含 2 个图像视图。

2) 在纵向模式下,将加载来自 layout-port/ 的布局,其中包含 1 个图像视图。

于 2012-09-17T14:00:57.813 回答
2

是的,GridView是最好和最简单的方法。您可以使用与现在相同的自定义ArrayAdapterOnClickListener并且ListView只需要更改

ListView myList = (ListView) findViewById(R.id.list);

GridView myGrid = (GridView) findViewById(R.id.gridview);

和xml类似:

 <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="390px"
        android:gravity="center"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth" />

现在,您应该避免使用“px”作为单位,而是使用“dp”,并且只有当您确实确定您的应用程序仅设计为 480x800 分辨率时。

于 2012-09-17T14:37:35.043 回答
1

gridView 不是一个布局。它是一个 adapterView ,因此它的目的是能够“显示”大量视图并能够在它们之间滚动。

也许您想改用 gridLayout ?它还有一个可比性库...

无论如何,如果您想坚持使用 gridView ,只需将 设置为android:numColumns您通过 values 文件夹为纵向模式设置的变量,并将 values-land 设置为横向模式所需的值


编辑:这是使用 gridView 的解决方案:

布局 xml 文件应包含以下内容:

<GridView android:layout_width="match_parent"
  android:numColumns="@integer/cols" android:layout_height="match_parent"
  />

在具有以下内容的文件夹中创建一个 xml 文件(例如“consts.xml”)res/values

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <item type="integer" name="cols">2</item>
</resources>

另外,在文件夹中创建相同的res/values-land文件,并将 2 设置为 3 。

于 2012-09-17T13:59:34.973 回答
1

您可以为不同的方向提供不同的资源。因此,当设备处于横向时,您使用在每个项目ListView中有两个ImageViews 的布局填充,而在纵向中,布局ImageView每个项目有 1 个。

查看提供资源以了解如何为不同的方向提供不同的布局 XML。

示例代码:

// Create an anonymous implementation of OnClickListener
private OnClickListener mImageListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the ImageView is clicked
    }
};

//Check the orientation and handle accordingly in the getView
public View getView (int position, View convertView, ViewGroup parent){
    if(convertView == null){
        convertView = (LinearLayout)inflater.inflate(R.layout.list_item, parent);
    }
    ImageView leftImage = (ImageView)convertView.findViewById(R.id.leftImage);
    ImageView rightImage = (ImageView)convertView.findViewById(R.id.rightImage);
    boolean isTwoColumn = (rightImage != null);

    //If it is two column layout, set both ImageViews
    if(isTwoColumn){
      leftImage.setImageResource(...);
      leftImage.setOnClickListener(mImageListener);
      rightImage.setImageResource(...);
      rightImage.setOnClickListener(mImageListener);
    }else{
      leftImage.setImageResource(...);
      leftImage.setOnClickListener(mImageListener);
    }
}

/res/layout-land/list-item.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <ImageView
      android:id="+@id/leftImage"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
    <ImageView
      android:id="+@id/rightImage"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
</LinearLayout>

/res/layout-port/list-item.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <ImageView
      android:id="+@id/leftImage"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
</LinearLayout>
于 2012-09-17T14:11:38.273 回答
0

我尝试了 Gridview 并个人发现获得我想要的显示非常繁琐(这是内部较小单元格的比例正确显示)......经过数周的不同分辨率和屏幕格式的调整后,我选择创建自己的 gridview从头开始,并没有回头。

我并不是说 Gridview 并非没有它的优点,但我可以说的是,如果你对它应该如何操作有一个非常清晰的想法,那么实现你自己的系统需要几个小时,你可能会发现它更容易自己编码。

从本质上讲,它只是一个派生自 ViewGroup 的类,覆盖 onMeasure 和 onLayout 项以测量它包含的子视图,然后将它们布置到屏幕上您想要它们的位置。

如果您正在寻找长列表,但我仍然会查看列表视图,或者网格视图可能值得一试,但这当然可以让您放心,如果需要,您可以完全控制它。

于 2012-09-17T14:05:51.543 回答