RecyclerView LinearLayout总是出现在其他元素的顶部

时间:2019-01-02 04:53:30

标签: java android android-recyclerview android-linearlayout

我有一个名为Messages的屏幕,它向用户显示最近的消息列表。在我的activity_messages.xml文件中,我有以下代码:

<View
    android:id="@+id/horizontal_line"
    android:layout_width="351dp"
    android:layout_height="1dp"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginBottom="8dp"
    android:background="@android:color/black"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.47"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/Game_Button"
    app:layout_constraintVertical_bias="0.216" />

基本上,此代码块创建一条水平线。在该水平下方,我要显示用户的最近消息。

在该水平线下面的代码中,我有以下代码:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout_editor_absoluteX="64dp"
    tools:layout_editor_absoluteY="168dp">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical">
    </android.support.v7.widget.RecyclerView>
</android.support.v4.widget.NestedScrollView>

这将显示用户的最近消息。

现在在我的Messages.java文件中,我有以下代码:

mMessagesLayoutManager = new LinearLayoutManager(Messages.this);
mRecyclerView.setLayoutManager(mMessagesLayoutManager);
mMessagesAdapter = new MessagesAdapter(getDataSetMessages(), Messages.this);
mRecyclerView.setAdapter(mMessagesAdapter);

for(int i = 0; i < 100; i++) {
    MessagesObject obj = new MessagesObject(Integer.toString(i));
    resultsMessages.add(obj);
}
mMessagesAdapter.notifyDataSetChanged();

此代码用于测试目的,但是可以工作。它以线性顺序显示所有用户的消息,我可以滚动查看它们。我唯一的问题是,当我运行该程序时,最近的消息不会在水平线以下开始。一些消息在水平线上方,在其他元素上方。我认为第一条消息跳到位置(0,0)。

该如何解决?我希望我的消息以现在的样子显示,位于水平线的下方。

3 个答案:

答案 0 :(得分:3)

更改此:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:layout_editor_absoluteX="64dp"
    tools:layout_editor_absoluteY="168dp">

对此:

<android.support.v4.widget.NestedScrollView
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@+id/horizontal_line"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent">

这里正在进行两个主要更改:

  • ConstraintLayout不完全支持match_parent,因此我们改用0dp(表示“匹配约束”)。
  • 为所有四个方面添加约束。开始/结束约束使视图水平填充屏幕,而顶部/底部约束使视图填充屏幕下方和底部的所有内容。

答案 1 :(得分:1)

这只是约束问题。 您尚未为recyclerview设置约束,尝试添加约束并再次运行 它会工作

答案 2 :(得分:1)

您可以使用android:orientation =“ vertical”在LinearLayout中包装第一个视图和滚动视图,也可以添加约束(如果根视图是ConstraintLayout)