回收站视图没有滚动到最后一个位置

Posted

技术标签:

【中文标题】回收站视图没有滚动到最后一个位置【英文标题】:Recycler view not scrolling to last position 【发布时间】:2021-10-19 06:08:43 【问题描述】:

我遇到了一个问题,可能是因为误解了 android recyclerview 滚动的工作原理。我希望这也可以对社区有所帮助,如果您回答,请详细提供有关原因和修复的信息。谢谢。

我遇到的主要问题是我有一个来自 end true RecyclerView 的堆栈,它显示了 firebase 实时数据库消息。当添加、删除一个孩子等时,我调用我的方法显示消息女巫用新消息列表设置适配器,然后滚动到最后一个位置。问题是没有滚动到最后一个位置,正如您将在此处的视频中看到的那样。

Error video (Click here)

我将使用的 ChatFragment 类留在这里。还有 ChatFragment 的布局。

聊天片段:

private void setAdapter() 
    loadingLayout.setVisibility(View.VISIBLE);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setStackFromEnd(true);
    recyclerViewMessageList.setLayoutManager(linearLayoutManager);


private void displayMessages(List<Message> messages) 
    if (messages.size() > 0) 
        MessageAdapter messageAdapter = new MessageAdapter(getActivity(), messages);
        recyclerViewMessageList.setAdapter(messageAdapter);
        recyclerViewMessageList.scrollToPosition(messages.size() - 1);
    
    loadingLayout.setVisibility(View.GONE);
    lottieAnimationViewLoading.cancelAnimation();

fragment_chat 布局:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".Fragments.ChatFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerViewMessageList"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toTopOf="@+id/constraintLayoutChatInput"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayoutChatInput"
        android:layout_
        android:layout_
        android:background="@android:color/white"
        android:elevation="6dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/recyclerViewMessageList">

        <EditText
            android:id="@+id/editTextChatSendMessage"
            android:layout_
            android:layout_
            android:layout_marginStart="24dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="4dp"
            android:layout_marginBottom="10dp"
            android:autofillHints="@string/write_message"
            android:background="@android:color/transparent"
            android:ems="10"
            android:hint="@string/write_message"
            android:inputType="textMultiLine"
            android:maxLines="6"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/imageViewChatSendMessage"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:id="@+id/imageViewChatSendMessage"
            android:layout_
            android:layout_
            android:layout_marginStart="4dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="24dp"
            android:layout_marginBottom="10dp"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:clickable="true"
            android:focusable="true"
            android:padding="8dp"
            android:src="@drawable/ic_send_blue"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/editTextChatSendMessage"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <include
        layout="@layout/loading_messages_layout"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

编辑:

我已经通过改变布局管理器的设置顺序解决了:

private void setAdapter() 
    loadingLayout.setVisibility(View.VISIBLE);


private void displayMessages(List<Message> messages) 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setStackFromEnd(true);
    recyclerViewMessageList.setLayoutManager(linearLayoutManager);
    MessageAdapter messageAdapter = new MessageAdapter(getActivity(), messages);
    recyclerViewMessageList.setAdapter(messageAdapter);
    recyclerViewMessageList.scrollToPosition(messages.size() - 1);
    loadingLayout.setVisibility(View.GONE);
    lottieAnimationViewLoading.cancelAnimation();

【问题讨论】:

如果您遇到问题,最好在发布问题时创建MCVE。您为此问题发布了近 500(五百)行行代码。人们需要解析和尝试在线调试的内容很多。请编辑您的问题并隔离问题,这样可以增加获得帮助的机会。 如果可能的话,请将您的 XML 代码用于设计问题。这样解决问题会更方便。 @maulikpanchal 完成 @AlexMamo 为了更好地理解,我已将第一个文件行减少为上述两种方法。 【参考方案1】:

如果您不使用(在这一行 recyclerViewMessageList.scrollToPosition(messages.size() - 2);)会发生什么,因为我在视频上看到它在正确位置打开但滚动到 -2 后位置

【讨论】:

没什么,它仍然在做同样的事情。 如果您尝试将 recyclerview 滚动到它的最大位置?类似 recyclerView.smoothScrollToPosition(position); 那么当你取下 recyclerViewMessageList.scrollToPosition(messages.size() - 2);) 并在设置 LayoutManager(layoutManager) 之前添加 layoutManager.setStackFromEnd(true)-> 时它不起作用? @Àlex 你解决了吗? 我按照编辑中的说明修复了它。

以上是关于回收站视图没有滚动到最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章

回收站视图滚动到特定位置

每次重新创建滚动位置后,如何将滚动位置保存在回收站视图中?

如何将按钮放在回收站视图的顶部?

电视 dpad 焦点中的水平回收视图在快速滚动时循环

滚动回收站视图时如何防止项目重复

以编程方式将 FAB 卷回