如何将RecyclerView始终保持在RelativeLayout中的View上方

时间:2016-07-14 12:48:10

标签: android android-layout android-recyclerview

我使用com.android.support:recyclerview-v7:23.2.1并使用该版本,可以在WRAP_CONTENT高度使用RecyclerView。我现在有以下布局:

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/message_list_row_parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/message_list_message_divider"
        android:layout_alignParentTop="true"
        android:clipToPadding="false"
        android:divider="@null"
        android:importantForAccessibility="no"
        android:listSelector="@android:color/transparent"
        android:padding="10dp"
        android:textColor="@color/textcolorprimary" />

    <View
        android:id="@+id/message_list_message_divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_above="@+id/message_list_layout_message"
        android:layout_gravity="center"
        android:background="@android:color/darker_gray"
        android:importantForAccessibility="no" />

    <RelativeLayout
        android:id="@+id/message_list_layout_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="20dp"
        android:layout_marginStart="20dp"
        android:importantForAccessibility="no"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/message_list_edittext_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_marginEnd="10dp"
            android:layout_toStartOf="@+id/message_list_button_send"
            android:background="@color/transparent"
            android:hint="@string/message_input"
            android:inputType="textMultiLine"
            android:maxLines="10"
            android:minLines="3"
            android:paddingBottom="5dp"
            android:paddingTop="5dp"
            android:textColor="@color/primaryColor"
            android:textSize="16sp" />

        <ImageButton
            android:id="@+id/message_list_button_send"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:layout_gravity="center"
            android:background="@null"
            android:contentDescription="@string/content_description_image_send"
            android:gravity="center"
            android:scaleType="fitXY"
            android:src="@drawable/custom_button_send" />
    </RelativeLayout>

</RelativeLayout>

Android Studio中的预览显示正确的布局,并在插入虚拟线View i上方RecyclerView。我需要这种布局,因为内部RelativeLayout的{​​{1}}可以在高度上增长(如果EditText的高度增加了3行,那么{{1} })。

当我在手机上安装它时出现问题。 EditText不在我定义的视图之上。它填满了设备的整个高度。所以我的recylcerview的最后一行总是在相对布局的后面。

为什么?我该如何解决?我需要RecyclerView始终保持在我的分隔线上方,并在相对布局高度增加时缩小高度。

修改我想提供一些屏幕截图来向您展示问题。第一个屏幕截图显示了我与当前布局的聊天:

Current Layout on Start

但缺少一个项目,因为滚动高度大于布局定义。我向下滚动后可以看到丢失的项目:

Missing Item

当我现在(只是为了找到问题的根源)从RelativeLayout移除RecylcerView并将其高度设置为300dp时,高度的变化得到正确的尊重:

Changed height

但正如你可以看到现在缺少几个项目,因为它们隐藏在视野之外(是的......即使我在初始化后以编程方式滚动到底部)。为了表明所有元素都在那里:

Missing items

所以高度得到正确设置......但是最后一个元素没有出现,直到我手动向下滚动。以编程方式滚动没有效果。

2 个答案:

答案 0 :(得分:1)

将其添加到RelativeLayout,其中包含EditText layout_below="@+id/message_list_message_divider"。并删除分隔符上的layout_above

答案 1 :(得分:0)

我修复了一个类似的问题,将您想要的元素放在顶部作为父布局的最后一个子节点,或者尝试将android:translationZ="1dp"放入recyclerview。