Android ListView行视图,左右边框拉伸到高度

时间:2013-08-13 16:16:21

标签: android android-listview

我有一个Android ListView,我希望包含一行TextView带文字(titleTextView)的行,我想要左边(leftCellBorder)和右边(rightCellBorder)边框图像,它被拉伸以填充行的高度。

行的高度取决于titleTextView中的文字数量。如果文本溢出到第二行,则应垂直拉伸两个边框以填充边框的高度。

因此,对于单行文本,行视图应如下所示:

enter image description here

使用两行文本,行视图应如下所示:

enter image description here

我的XML的第一个版本是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

     <ImageView
         android:id="@+id/leftCellBorder"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_alignParentBottom="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
         android:layout_gravity="fill_vertical"
         android:adjustViewBounds="true"
         android:scaleType="fitXY"
         android:src="@drawable/cell_border_left" />

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="210dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text="Title"
        android:textSize="30dp" />

    <ImageView
        android:id="@+id/rightCellBorder"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/cell_border_right" />

</RelativeLayout>

我认为将leftCellBorderrightCellBorder的{​​{1}}设为layout_height就足以确保它们被拉伸到正确的高度,但这并不是'我的工作和结果如下:

enter image description here

即。图像没有被拉伸以填满高度。

然后我回去尝试在根部使用水平match_parent而不是LinearLayout并且有3个子视图。这实际上是有效的,并且左右边界被适当地拉伸以填充高度,但是我遇到的问题是似乎没有办法将RelativeLayout夹在右侧用rightCellBorder(除非我遗漏了什么)。

那么 - 我怎样才能达到我想要的效果呢?我希望坚持LinearLayout,因为这给了我更大的灵活性。当然这应该不会那么困难!

3 个答案:

答案 0 :(得分:1)

如果您想坚持使用RelativeLayout将ImageViews的属性更改为:

android:layout_height="wrap_content"
android:layout_alignTop="@+id/titleTextView"
android:layout_alignBottom="@+id/titleTextView"

并移除alignParentTopalignParentBottomlayout_gravity

答案 1 :(得分:1)

线性布局绝对是您设计的更好的布局选择(并且渲染速度更快)。您只需要使用layout_weight属性。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/leftCellBorder"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/cell_border_left" />

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="0dp" <!-- When assigning a weight, either the width or the height will be inferred from the weight depending upon your layouts orientation. Whichever will be inferred should be set to 0dp, it's more efficient. -->
        android:layout_height="wrap_content"
        android:layout_weight="1" <!-- If only one child has weight, it occupies all the remaining space. (As with real children.) -->
        android:gravity="center"
        android:text="Lorem Ipsum Dolor Sit Amet Consecteteur Adipiscing Elit"
        android:textSize="30dp" />

    <ImageView
        android:id="@+id/rightCellBorder"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/cell_border_right" />

</LinearLayout>

编辑: 然而,最简单的解决方案是为您的背景绘制创建一个9补丁,抛弃ImageView并将其应用到TextView;你可以简单地使用填充来确保文本保留在透明部分......就像这样:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="20dp" <!-- Use the padding to space the text from your sides -->
        android:paddingRight="20dp"
        android:background="@drawable/YOUR_9_PATCH"
        android:gravity="center"
        android:text="Lorem Ipsum Dolor Sit Amet Consecteteur Adipiscing Elit"
        android:textSize="30dp" />

</LinearLayout>

如果你想要/需要TextView之外但在周围元素之前的空间,你可以在布局上使用填充......

答案 2 :(得分:0)

返回LinearLayout并尝试:

<ImageView
.
.
android:layout_weight="0"
>
<TextView
.
.
android:layout_weight="1"
>
<ImageView
.
.
android:layout_weight="0"
>

(确保所有视图上的android:layout_width =“wrap_content”)