不使用wrap_content时,RecyclerView从中间开始

时间:2018-12-05 23:58:57

标签: android kotlin

我在RecyclerView内有一个ConstraintLayout,我需要将高度设置为0dp,以便它遵守其约束并且不会进入其他视图。但是一旦列表被加载,其设置就位于列表的中间。 如果我将高度设置为wrap_content,则此问题已解决,但是看起来不正确,因为它填满了屏幕并且位于其他视图下 我什至尝试将RV包装在FrameLayout中,以便可以将RV设置为包装内容,并且仍然遵守约束,但这使我发布了一个(中间的装货)。

<ConstraintLayout>
  <view above>
  <android.support.v7.widget.RecyclerView
        android:id="@+id/messagesRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="view above"
        app:layout_constraintBottom_toTopOf="view below"
        android:layout_marginBottom="10dp" />
  <view below>
</ConstraintLayout>

以及我用于设置RV的代码:

with(recyclerView){
  setHasFixedSize(true)
  overScrollMode = View.OVER_SCROLL_NEVER
  setLayoutManager(LinearLayoutManager(context).apply { stackFromEnd = true })
  setAdapter(adapter)
  setItemAnimator(itemAnimator)
}

我知道我可以使用scrollToPosition(),但是当列表中有图像时,我必须等到它们全部加载后才能调用它,这需要几秒钟的时间并且显示出来对用户来说口吃。

UPDATE 我最初将高度设置为0dp,这将导致列表从滚动到中间开始。稍后,我将其设置为wrap_content和match_parent,这将导致列表跨越整个宽度或窗口并与容器中的其他视图重叠。

4 个答案:

答案 0 :(得分:0)

注意:

stackFromEnd = true 

当stackFromEnd为true时,列表将从视图底部开始填充其内容。

答案 1 :(得分:0)

只需将回收站视图高度设置为0dp

<ConstraintLayout>
  <view above>
  <android.support.v7.widget.RecyclerView
        android:id="@+id/messagesRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="view above"
        app:layout_constraintBottom_toTopOf="view below"
        android:layout_marginBottom="10dp" />
  <view below>
</ConstraintLayout>

答案 2 :(得分:0)

您已将约束设置为父视图的顶部和底部,因此该视图将延伸至顶部和底部。您需要将约束设置如下

<ConstraintLayout>
  <view above>
  <android.support.v7.widget.RecyclerView
        android:id="@+id/messagesRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@id/your_above_view_id"
        app:layout_constraintBottom_toTopOf="@id/your_below_view_id"
        android:layout_marginBottom="10dp" />
  <view below>
</ConstraintLayout>

答案 3 :(得分:0)

结果是,如果将RV(RecyclerView)高度设置为0dp(又称匹配约束),则还必须将宽度设置为0dp。这是一个Android错误。

这是修复它的代码:

<android.support.v7.widget.RecyclerView
    android:id="@+id/messagesRecyclerView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="[view above]"
    app:layout_constraintBottom_toTopOf="[view below]"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    android:layout_marginBottom="10dp" />