如何创建多行,多列列表项布局?

时间:2016-06-08 23:27:33

标签: android android-layout android-linearlayout listviewitem android-relativelayout

我正在创建一个消息传递应用程序,目前正在处理收件箱。我使用RecyclerView来显示会话列表,并希望每个列表项看起来像这样:

enter image description here

  1. 最左边是90dp x 90dp
  2. 的接触图像
  3. 第一行有两列 - 联系人姓名和日期。 的日期应该是我目前拥有的固定尺寸,但最多适合DD / MM / YYYY(在"星期日和#34;等等的情况下可以更小)应该固定在合适的边缘。联系人应根据需要进行扩展,以填补截至日期的任何空间。
  4. 第二行包含最后一条消息的文本。
  5. 我打算使用layout_weight,但这不适用于RelativeLayout(并且在短日期的情况下不允许联系人姓名延长) LinearLayout不允许我使用layout_toEndOf。我是Android开发的新手,所以我不确定其中一个是否是"对"回答。

    完成我正在寻找的布局的正确方法是什么?

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">    
    
        <RelativeLayout
            android:id="@+id/conversation_info"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="@dimen/activity_horizontal_margin">
    
            <RelativeLayout
                android:id="@+id/conversation_image_layout"
                android:layout_width="90dp"
                android:layout_height="90dp">
    
                <ImageView
                    android:id="@+id/conversation_contact_image"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" />
    
            </RelativeLayout>    
    
            <TextView
                android:id="@+id/conversation_contact_name"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/activity_vertical_margin"
                android:gravity="center_vertical"
                android:textSize="@dimen/conversations_contact_font_size"
                android:layout_toEndOf="@id/conversation_image_layout" />    
    
            <TextView
                android:id="@+id/conversation_date"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_toEndOf="@id/conversation_contact_name"
                android:gravity="right"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:textSize="@dimen/conversations_date_font_size" />    
    
            <TextView
                android:id="@+id/conversation_snippet"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/conversation_contact_name"
                android:textSize="@dimen/conversations_snippet_font_size"
                android:layout_toRightOf="@id/conversation_image_layout" />
    
        </RelativeLayout>    
    
        </LinearLayout>
    

    这是列表项目目前的样子(我还没有加载联系人图片)。它在大多数情况下都很好(尽管我的布局代码可能非常臃肿,所以如果有人能指出使其更简洁的方法,我会感激,但请注意日期不是如此)与联系人姓名和包装相同的级别:

    enter image description here

2 个答案:

答案 0 :(得分:0)

其中一个textView有MarginTop属性,另一个没有。在两者上删除它或将它添加到两者:

<TextView
        android:id="@+id/conversation_contact_name"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:gravity="center_vertical"
        android:textSize="@dimen/conversations_contact_font_size"
        android:layout_toEndOf="@id/conversation_image_layout" />    

    <TextView
        android:id="@+id/conversation_date"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/conversation_contact_name"
        android:gravity="right"

        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:textSize="@dimen/conversations_date_font_size" />

此外,我建议您使用带有嵌套线性布局和权重的线性布局,以便在不同的屏幕和设备上获得更好的性能。如果您在其他设备上运行它,这可能会崩溃。不要相信我,试试吧:)。

答案 1 :(得分:0)

在我清楚地知道某些布局参数并不意味着我认为他们做了什么之后,我花了一些时间来看看我的选择。

建议在列表项中嵌套LinearLayouts / use layout_weight,因为随着更多项目的添加,创建的视图数量会迅速增加。我设法缩小我的代码并使用以下代码将其保存在单个RelativeLayout中:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/conversation_info"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/activity_horizontal_margin">

    <ImageView
        android:id="@+id/conversation_contact_image"
        android:layout_width="64dp"
        android:layout_height="64dp"/>

    <TextView
        android:id="@+id/conversation_contact_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/conversations_contact_font_size"
        android:layout_toEndOf="@id/conversation_contact_image"/>

    <TextView
        android:id="@+id/conversation_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignBaseline="@id/conversation_contact_name"
        android:textSize="@dimen/conversations_date_font_size"/>

    <TextView
        android:id="@+id/conversation_snippet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/conversation_contact_name"
        android:textSize="@dimen/conversations_snippet_font_size"
        android:layout_toEndOf="@id/conversation_contact_image"/>

</RelativeLayout>

值得注意的变化:

  • 没有嵌套标签 - 没有必要将第一行分组为自己的布局
  • 已使用layout_alignBaseline - @Vucko指出我在联系人姓名上使用marginTop但未使用日期。即使在取下它之后,两者仍未对准。 android:gravity没有效果,事实证明这些都不会影响布局中的文字
  • 使用layout_alignParentEnd来修复日期问题。我已经意识到,在我的情况下,布局组件通常只需要引用另一个,以便相对于布局的其余部分正确对齐自己。