我正在开发android信使应用程序,并使用一个RecyclerView显示消息。我有一个按钮,从服务器加载所有消息,并通过点击它向下滚动到最后一个。但是,在点击这个按钮后,我只看到最后一个消息的一半内容。此外,当我向上滚动一点并第二次单击此按钮时,我没有遇到问题,并看到了上一条消息的所有内容。
设置按钮的代码。
private fun setupToLastMessagesButton() {
binding.toLastMessagesButton.setOnClickListener {
// Show progress bar while messages is loading
binding.mainProgressBar.visibility = View.VISIBLE
// Tell service's thread to load messages by using handler and post mechanism
getServiceHandler().post {
val result = getService().getLastMessages()
// Tell main thread to update recycler view and scroll down
mainHandler.post {
// Finish showing progress bar
binding.mainProgressBar.visibility = View.GONE
// Notify adapter
getAdapter().notifyItemRangeInserted(result.first, result.second)
// Scroll to last element
binding.messagesView.scrollToPosition(getAdapter().itemCount - 1)
}
}
}
}
循环检视.xml程式码
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/messagesView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/recyclerViewProgressBar"
app:layout_constraintTop_toTopOf="parent" />
Screenshot shows my problem. You can see that last element have incorrect layout and you can't see a text of message.
我猜RecyclerView在调用'binding.messagesView.scrollToPosition(getAdapter().itemCount - 1)'之前没有时间完成重新连接。我尝试在一段延迟后调用此函数,但没有任何变化。是否有机制在重新连接完成时等待片刻?
Screenshot shows behaviour I'm expecting.
1条答案
按热度按时间u1ehiz5o1#
您应该在另一个
post
中调用scrollToPosition
,为RecyclerView
给予一个获取数据和测量/绘制(在内存中,第一帧)新项时间。目前它正在滚动到这个新项目的一半,可能是因为它还没有被绘制,并且
RecyclerView
“认为”这个项目更小(所以滚动一点到少量像素,而不是到最后)。我打赌你的“清除”项目/布局(没有填充msg数据)不包含这个带有数字的灰色区域,所以RecyclerView
只滚动到总是可见的username-row