回收站视图没有滚动到最后一个位置
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 你解决了吗? 我按照编辑中的说明修复了它。以上是关于回收站视图没有滚动到最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章