【问题标题】:Set the List item row height in xml has no effect在xml中设置List项行高没有效果
【发布时间】:2014-09-17 04:34:08
【问题描述】:

我尝试在 xml 文件中设置列表项的行高。例如,我有一个 listView 和一个对应的 listAdapter,这个适配器从 xml 文件中膨胀一个视图:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal" >

        <ImageView 
            android:id="@+id/indicator"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/ic_right"/>

        <TextView
            android:id="@+id/info"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:padding="20dp"
            android:textSize="16sp"
            android:textColor="#f96f00"
            android:layout_gravity="center"
            android:lines="1"
            android:ellipsize="end"
            />

        <TextView
            android:id="@+id/number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textSize="12sp"
            android:paddingRight="10dp"
            />
    </LinearLayout>

但是这个60dp 没有任何效果,无论你设置了多少这个高度,膨胀的行视图都有一个固定的高度。当我调整布局内的 textview 时,行高发生了变化。为什么会发生这种情况,我如何将列表项行的高度分配给固定指标?

【问题讨论】:

  • 把列表视图的代码也贴出来
  • 你的线性布局高度 android:layout_height="match_parent" 请试试
  • 我刚刚将您的代码粘贴到我的 Eclipse 中并设置了我自己的图像来代替您的图像,它看起来很好,占据 60dp 的高度,因此请检查您的图像大小和列表适配器的邮政编码
  • 您在 textview 中将布局权重分配给 1。欲了解更多信息developer.android.com/guide/topics/ui/layout/linear.html#Weight
  • 把你试过的代码放在这里。你的 xml 看起来不错

标签: android xml


【解决方案1】:

我查看了 LayoutInfalter 的 infalte 函数的源代码,如果 root 为 null,则不会为此视图生成 LayoutParams,并且在附加到其他视图时将使用默认的 layoutParams。如果设置了 root,那么 inflater 将为此视图生成并设置一个 LayouParams。但是,attachToRoot 不能设置为 true,因为 View get 很快就会添加到适配器视图中。

View v = inflater.inflate(R.layout.filtered_trip_row, parent,false);

这解决了我的问题。

【讨论】:

  • 非常感谢,这为我的自定义 ListView 修复了我太高的行项目。
【解决方案2】:

好吧好吧,发生这种事不用惊慌。

在您的适配器的getView中,只需在返回视图之前编写此代码。

// Just reset the layout parms before return
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                            60*3); // put proper dp pixel conversion here, in hdpi it 3px = 1dp

    view.setLayoutParams(params);
    return view;

【讨论】:

  • 你的回答确实解决了我的问题,但我认为更好的方法可能是使用 View v = inflater.inflate(R.layout.filtered_trip_row, parent,false);这样xml中设置的布局属性就会生效。
【解决方案3】:

在增加行时,请检查“父”参数为空,

View v = inflater.inflate(R.layout.filtered_trip_row, null);

不如试试这个,

View v = inflater.inflate(R.layout.filtered_trip_row, parent);

现在尝试在 getView 中设置您的高度。

希望对你有所帮助。

【讨论】:

  • 我查看了LayoutInfalter的infalte函数的源码,如果root为null,则不会为此视图生成LayoutParams,附加到其他的时候会使用默认的layoutParams。如果设置了 root,那么 inflater 将为此视图生成并设置一个 LayouParams。但是,您的回答部分正确,因为在 listAdapter 的 get view 中,您不能将 attachToRoot 设置为 true(设置 root 时默认为 true),它会抛出异常
  • 您可以制作 LayoutParam 的实例并设置为您的视图
  • 当我按照您的建议将“null”设置为“parent”时,它使我的应用程序崩溃并给了我一个 java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView 错误。之前,我也有同样的问题。我的列表行太高了,但在 xml 中调整它没有任何作用。
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 2016-09-30
  • 2023-03-23
  • 2015-02-19
相关资源
最近更新 更多