android中ListView行的动态高度

Posted

技术标签:

【中文标题】android中ListView行的动态高度【英文标题】:Dynamic height for ListView row in android 【发布时间】:2012-03-01 14:40:18 【问题描述】:

我发现我的 ListView 出现了一种奇怪的行为,我似乎无法解决。

我有一个 ListView,其中填充了一些数据。每行包含一个图像和三个文本标签。这是我的行的 XML(我在适配器的 getView 方法中对其进行膨胀):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="0dip"
     android:paddingBottom="0dip"
     android:layout_
     android:layout_
     android:orientation="horizontal">

    <ImageView android:id="@+id/Icon"
        android:layout_
        android:layout_
        android:layout_weight="2"
        android:padding="2dp"
        android:scaleType="fitCenter"
        android:contentDescription="@string/app_icon"/>

    <TextView android:id="@+id/TxtName"
         android:scrollHorizontally="false"
         android:layout_
         android:layout_
         android:textColor="@android:color/black"
         android:background="@color/list_bg1"
         android:layout_weight="2"
         android:padding="2dp"/>

     <TextView android:id="@+id/TxtPackage"
         android:scrollHorizontally="false"
         android:layout_
         android:layout_
         android:layout_weight="2"
         android:textColor="@android:color/black"
         android:background="@color/list_bg2"
         android:padding="2dp"/>

     <TextView android:id="@+id/TxtSource"
         android:scrollHorizontally="false"
         android:layout_
         android:layout_
         android:layout_weight="2"
         android:background="@color/list_bg3"
         android:textColor="@android:color/black"
         android:padding="2dp"/>
</LinearLayout>

现在,进入文本字段的任何内容都可以是任意长度(从几个字符到 80-100 个字符),我希望标签只是换行,行的高度可以扩展以适应换行的高度标签。

然而,标签确实可以包裹,但行的高度没有扩大,因此标签的底部被切断了。这是我的getView 方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) 
    SetInfo app = (SetInfo)getItem(position);
    if(app == null)
        return null;

    LinearLayout row = (LinearLayout) (convertView == null
               ? LayoutInflater.from(context).inflate(R.layout.listitem, parent, false)
               : convertView);
    ((TextView)row.findViewById(R.id.TxtName)).setText(app.getName());
    ((TextView)row.findViewById(R.id.TxtPackage)).setText(app.getPackage());
    ((TextView)row.findViewById(R.id.TxtSource)).setText(app.getSource());
    if(app.getIcon() != null)
        ((ImageView)row.findViewById(R.id.Icon)).setImageDrawable(app.getIcon());
    return row;

如何让行的高度不同,自动调整以适应所有内容?

【问题讨论】:

更好的方法是在 Textview 的行布局中使用 android:maxLines=1 防止超过一行文本 你试过把 android:layout_weight 调整为 1 什么的吗? @Samir:我想要完全相反:标签必须换行,因为我需要所有文本都可见。 @AndroSelva:layout_weight 在哪个组件上?我已经习惯于调整行内各个子视图的宽度,但是如何使用它来调整行的高度? 【参考方案1】:

尝试将您的 TextView 更改为 android:layout_。

【讨论】:

这几乎是我想要的。也就是说,行的高度现在扩展到允许标签的换行,但是我失去了通过为不同的标签设置不同的背景颜色来正确着色列的能力。现在颜色只延伸到标签包裹的地方,如果另一个标签包裹更多行,我的彩色标签下会出现白色默认背景。任何想法如何解决这个问题? 我会接受这个答案,因为这最终是我必须做的 - 然后进行一大堆其他痛苦的处理以按照我想要的方式获得布局。【参考方案2】:

我遇到了山姆问题,@maebe 的回答对我不起作用。为了让它工作,我必须在适配器的 getView 中调用我的 TextView 上的 requestLayout()。

因此,在您的情况下,您必须为每个 TextView 调用 requestLayout():

@Override
public View getView(int position, View convertView, ViewGroup parent) 

    // Inflate your view etc.

    row.findViewById(R.id.TxtName).requestLayout();
    row.findViewById(R.id.TxtPackage).requestLayout();
    row.findViewById(R.id.TxtSource).requestLayout();
    return row;

我尝试了各种技巧,但这是唯一对我有用的技巧。

【讨论】:

+1 为这个 hack。成就了我的一天。非常感谢@muscardinus

以上是关于android中ListView行的动态高度的主要内容,如果未能解决你的问题,请参考以下文章

android动态设置listview高度

如何设置 ListView 行高

Android ScrollView中嵌套ListView

Android 添加动态 ListView 标头

Android ScrollView嵌套ListView冲突问题

Android动态设定GridView的高度,固定column,实现高度自适应