设置ListView的项高度

19

这应该是一件非常容易的事情,但看起来它很棘手。在我的代码中,我有这个ListView:

<ListView android:id="@+id/sums_list" android:layout_width="fill_parent"
        android:layout_height="0dp" android:layout_weight="1" android:dividerHeight="0dp"></ListView>

使用此视图的 ArrayAdapter 填充该视图:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cdpb="http://schemas.android.com/apk/res/ale.android.brainfitness"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="55dp">
...
</LinearLayout>
为什么这个项目的高度不是55dp呢?
谢谢大家。

为什么要用 android:layout_height="0dp" - Mariusz Jamro
1
实际上发生了什么?您是否看到了物品,但高度不正确?您是否看不到任何物品?您发布的内容似乎没有明显的问题,但了解您的适配器和当前所看到的内容将会很有帮助。 - Sam Judd
@Secator,0dp 定义了权重是应用于高度还是宽度。因此,在此示例中,将权重为 1 应用于高度,因为其设置为 0dp。 - Dave Haigh
4个回答

67
你是如何填充视图的? 如果你像下面这样将“parent”参数设置为null,则布局参数会被忽略。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
  ...
  View v = inflater.inflate(R.layout.filtered_trip_row, null);
  …

  return v;
}

将“parent”传递给inflate应该按您的预期工作。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  ...
  View v = inflater.inflate(R.layout.filtered_trip_row, parent);
  …

  return v;
}

这篇文章详细解释了相关知识:为什么LayoutInflater会忽略我指定的layout_width和layout_height布局参数?

如果你想避免出现“UnsupportedOperationException”异常,可以在调用inflator时将false作为一个输入参数添加进去。例如:

inflater.inflate(R.layout.filtered_trip_row, parent, false)

1
如果您遇到了“unsupported operation”错误,请尝试以下代码:LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mDisplayWidth / 3, 30); convertView.setLayoutParams(params); - cV2
11
@Amol Brid,我遇到了错误 java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView。 意思是在AdapterView中不支持使用addView(View, LayoutParams)方法添加视图。 - Alan Lai
17
为了避免 @AlanLai 的问题,在方法 inflate 中加入参数 false - mdelolmo
7
这段代码的意思是使用布局填充器(inflater)将指定的布局文件(R.layout.filtered_trip_row)转换为视图对象(View),并将其添加到指定的视图组(parent)中。在这个过程中,不会将该视图添加到父视图中,因此第三个参数传递了false。 - VSB
@Amol Brid 我遇到了错误:java.lang.UnsupportedOperationException: addView(View, LayoutParams) 在 AdapterView 中不受支持。 - Spry Techies
显示剩余2条评论

9
@Override
public View getView(int position, View convertView, ViewGroup parent) {
  ...
  View v = inflater.inflate(R.layout.filtered_trip_row, parent,false);
  …

  return v;
}

只需将布尔值传递给该方法,使其将您的行布局添加到列表视图中,并且它将不会再出现错误,例如java.lang.UnsupportedOperationException: AdapterView不支持addView(View,LayoutParams)

并通过适配器添加您想要填充的yourLayout。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cdpb="http://schemas.android.com/apk/res/ale.android.brainfitness"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="55dp">
...
</LinearLayout>

这对我很有效,我认为它可能对你有帮助。


0
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:minHeight="60dp"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center"
    android:weightSum="1"
    android:background="@color/main_color">

    <ImageView
        android:id="@+id/img_left_menu"
        android:layout_weight="0.4"
        android:focusable="false"
        android:maxHeight="50dp"
        android:maxWidth="50dp"
        android:minHeight="50dp"
        android:minWidth="50dp"
        android:layout_width="0dp"
        android:scaleType="centerInside"
        android:adjustViewBounds="true"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tx_left_menu"
        android:layout_width="0dp"
        android:textSize="18dp"
        android:layout_gravity="center_vertical"
        android:layout_weight="0.6"
        android:singleLine="true"
        android:layout_height="wrap_content"
        android:focusable="false"
        />
</LinearLayout>

在适配器中将父项设置为上述描述

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  ...
  View v = inflater.inflate(R.layout.filtered_trip_row, parent,false);
  …

  return v;
}

0
convertView = inflater.inflate(R.layout.custom_row, parent, false);

if (CONDITION) {
    holder.wholeLayout.getLayoutParams().height = 1; // visibility Gone not working && 0 height crash app.
} else {
    holder.wholeLayout.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接