我有一个RecyclerView
用于以文本应用类型的方式显示消息。我的意思是,添加到RecyclerView
的新邮件应显示在底部。
目前,我在.setStackFromEnd(true)
上使用LinearLayoutManager
来显示消息从底部开始:
layMng = new LinearLayoutManager(this);
layMng.setStackFromEnd(true);
mRecyclerView.setLayoutManager(layMng);
mRecyclerView.setAdapter(mAdapter);
当收到足够的消息并且消息列表即将溢出屏幕顶部时,会发生什么情况,它会停止始终在底部显示新消息。我必须手动向下滚动以查看新增内容。
如何才能让最新消息可以查看,或者在收到新项目时向下滚动RecyclerView
?
我在我的布局管理器上尝试了各种方法,例如.scrollToPosition()
和.scrollToPositionWithOffset()
,但到目前为止我看到的建议都没有奏效。关于这个问题的一些顶级StackOverflow问题有顶级答案,甚至没有解决原始问题..
那怎么办呢?
答案 0 :(得分:1)
请检查layout_height。它应该是android:layout_height =“match_parent”
在UI线程中运行smoothScrollToPosition
我的代码中的代码段
<android.support.v7.widget.RecyclerView
android:id="@+id/topic_screen_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="18dp"
/>
//这里topicScreenList引用了我的Recylerview: // - messageAdapter:引用adpapter对象
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setStackFromEnd(true);
topicScreenList.setLayoutManager(layoutManager);
topicScreenList.setAdapter(messageAdapter);
}
获取任何新消息后,从后端服务
调用以下代码-Hey MessageItem正在引用适配器消耗的新消息项
@Override
public void onNewMessage(final MessageItem messageItem) {
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
messageAdapter.addMessageToEnd(messageItem);
topicScreenList.smoothScrollToPosition(messageAdapter.getItemCount());
}
});
}
}
//code from my Adapter
public void addMessageToEnd(MessageItem messageItem) {
messageItems.add(messageItem);
notifyItemInserted(messageItems.size() -1);
}
答案 1 :(得分:0)
试试这个,我也开发了一个聊天应用程序,它对我来说非常适合
mRecyclerView.setAdapter(adaptorChat);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
llm.setStackFromEnd(true);
mRecyclerView.setLayoutManager(llm);
XML
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/messages_list_sponsor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/edit_compose_msg_container" />
<LinearLayout
android:id="@+id/edit_compose_msg_container"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:orientation="horizontal"
android:padding="3dp">
<EditText
android:id="@+id/compose_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:background="@drawable/white_edit_text_style"
android:hint="@string/enter_message"
android:inputType="textMultiLine"
android:minHeight="50dp"
android:paddingEnd="4dp"
android:paddingLeft="6dp"
android:paddingRight="4dp"
android:paddingStart="6dp"
android:singleLine="false"
android:textColor="@color/black"
android:textColorHint="@android:color/darker_gray" />
<ImageView
android:id="@+id/send_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="5"
android:clickable="true"
android:padding="15dp"
android:rotation="-35"
android:layout_marginBottom="5dp"
android:src="@drawable/message_send" />
</LinearLayout>
</RelativeLayout>
答案 2 :(得分:0)
mRecyclerView.scrollToPosition(position);
应该有效。它可能是在更新位置/适配器之前尝试滚动。尝试:
int delay = 500;
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
//scroll to bottom
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount());
}
}, delay);
答案 3 :(得分:0)
如果已设置 mRecyclerView.setNestedScrollingEnabled(false),则将其删除。