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

由于我的屏幕为480x800(纵向),因此ImageView的宽度为480px,而横向的两个图像的宽度均为400px。 这不是问题,但对我来说,重要的是要遵守宽度/高度比。

#1楼 票数:3 已采纳

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

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

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

#2楼 票数:2

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

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分辨率。

#3楼 票数: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"
  />

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

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

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

#4楼 票数:1

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

查看提供资源一文 ,了解如何为不同的方向提供不同的布局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>

#5楼 票数:0

我尝试使用Gridview并亲自发现它是令人难以置信的,它获得了我想要的显示(对于内部较小的单元格,它是比率正确的显示)...在以不同的分辨率和屏幕格式对其进行了数周的测试之后,我选择创建自己的gridview从无到有,再也没有回头。

我并不是说Gridview并非没有优点,但我可以说的是,如果您有一个非常清晰的想法如何实现自己的系统,那么实现自己的系统将花费几个小时,您可能会发现它更容易实现自己编写代码。

从本质上讲,这只是一个从ViewGroup派生的类,重写onMeasure和onLayout项目以测量其包含的子视图,然后将它们放置在屏幕上所需的位置。

如果您正在寻找长列表,但是我仍然会查看listview,或者gridview也许值得一试,但这当然让您高枕无忧,知道您可以根据需要控制所有内容。

  ask by Francesco Boffa translate from so

未解决问题?本站智能推荐:

3回复

为什么我的图像在横向模式下消失了?

我有一个纵向模式的图像,可以正确显示。 当我将配置更改为横向时,不会显示图像。 请注意,封闭ImageView的LinearLayout显示正确(我通过更改背景来检查它)。 但是当我更改了ImageView的背景时,背景也没有显示出来。
1回复

Android:在ImageView顶部进行手绘

我想在ImageView顶部实现手绘功能。 这是我的布局: 我为HandDrawingCanvasView类遵循Android示例中的多点触控跟踪 : 这些是结果: 如您所见,我甚至可以在图像外部进行绘制(蓝色区域是ImageView背景)。 如何将可绘制区域限
1回复

Android布局方向在横向模式下更改

我有一个FrameLayout我的片段里面,我里面其他三个布局FrameLayout 。 我希望这三个布局之一可以更改其在景观上的视图位置,因此我为此布局创建了两个XML文件,并将它们分别放置在layout-port和layout-land内,但是该布局在横向模式下仍使用纵向布局。 那我还需
3回复

ListView不在横向模式下显示所有项目

我有一个适合人像模式下屏幕尺寸的Activity ,如下图所示 问题是当我旋转屏幕时, ListView折叠并仅显示一项,如下图所示 是什么导致此问题,我该如何解决? 这是我的xml布局文件
2回复

如何在android中根据上面的imageview对齐textview

每当我在横向模式下在不同的屏幕尺寸设备上测试时,我对布局的结果都不满意。 在肖像中,我喜欢textview的边缘。 由于我当前的imageview图像大小不会填满某些设备的整个宽度,因此在左侧和右侧都有一些空白,这很好。 但是,textview的边距也应该考虑这个空白并以某种方式添加它。
3回复

横向模式在Android Studio中不起作用

我已经为横向模式创建了适用于所有不同屏幕尺寸(例如小,大,中和超大)的Android布局资源文件,但是,当我运行该应用程序时,由于一半的按钮,图像在横向模式下不起作用,因此图像丢失从屏幕上。 我还将以下行包含在android Manifest文件中。 请提出建议,让我知道如何使用横
2回复

横向模式破坏布局

在几乎所有设备上,我的应用在人像环境中看起来都很完美。 但是在“风景”模式下,它会中断并将“视图”彼此叠加。 我在Android Studio中安装了GenyMotion插件,并且尝试通过安装不同类型的设备进行尝试,但是问题仍然存在。 这是纵向模式的示例: 横向模式:
2回复

手机为纵向模式,平板电脑为纵向+横向

我正在构建一个通用的android应用,其中手机仅需要支持纵向,平板电脑将支持纵向和横向。 这是我的布局结构 layout-port layout-sw600dp-port layout-sw600dp-land 但是,如果手机处于横向模式,则应用程序将崩溃,并导致资源未找到异常。