就像在聊天应用程序中,每当我们想要发送消息时,软键盘弹出窗口也会自动将最后看到的消息滚动到软键盘顶部,前提是软键盘后面没有隐藏任何内容。但在我的情况下,键盘隐藏了对话。如何解决此问题,我已经习惯使用回收站视图来显示消息。我用了android.support.v7.widget.RecyclerView
3 回答
使用 RecyclerView,您可以按如下方式实现:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
recyclerView.setLayoutManager(linearLayoutManager);
此代码块将告诉 RecyclerView 相对于列表底部滚动,但它也会以相反的顺序显示消息,因此在您的代码中,如果您从数据库中获取消息,请从最后一条消息中读取它们,如下所示:
Cursor c = ...;
c.moveToLast();
do{
//your code which gets messages from cursor...
}while(c.moveToPrevoius());
当您想向列表中添加新消息时,只需像这样添加它们:
//ArrayList messages
messages.add(0, message);
我如何处理这个问题非常简单,以实现一种良好的行为,类似于 Whatsapp 或其他流行的聊天。
一开始,LinearLayoutManager
这样设置。
new LinearLayoutManager(this.getContext(), LinearLayoutManager.VERTICAL, true);
chatLayoutManager.setStackFromEnd(true);
当消息开始溢出RecyclerView
底部时,需要将当前位置设置为 0,为了实现这一点,一个简单的界面就像一个魅力,在RecyclerView.Adapter
渲染最后一条消息时发出警告。
public interface OnLastItemRendered{
void lastItemRendered();
}
将 Activity/Fragment 中的接口实现传递给 deRecyclerView.Adapter
以scrollToPosition
在RecyclerView
.
new ChatMessageListAdapter(
context, user, lastOldMessages,
new OnLastItemRendered() {
@Override
public void lastItemRendered() {
ContainerFragment.this.myRecyclerViewToChat.scrollToPosition(0);
}
});
最后,如果要在 中执行动画RecyclerView
,实现一种方法,将RecyclerView.Adapter
调用中的消息添加到方法的末尾notifyItemInserted
。
public void add(ChatMessage chatMessage) {
if (this.chatMessages == null) {
this.chatMessages = new ArrayList<ChatMessage>();
}
this.chatMessages.add(chatMessage);
Collections.sort(this.chatMessages, this.orderChatMessagesComparator);
this.notifyItemInserted(0);
this.onLastItemRendered.lastItemRendered();
}
并且,对于开始加载的 X 消息,在onBindViewHolder
.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final ChatMessage currentMessage = this.chatMessages.get(position);
... //Do your stuff.
if (position == 0) this.onLastItemRendered.lastItemRendered();
}
完成工作。
您可以检测编辑文本上的焦点,如果您的 editText 有焦点,请将您的 recyclerView 列表滚动到最后一个元素。
private OnFocuseChangeListener focuseListener = new OnFocuseChangeListener(){
public void onFocusChange(View v, boolean hasFocus){
if(hasFocus){
// Scroll down to the last element of the list
recyclerView.scrollToPosition(sizeOfYourList);
} else {
focusedView = null;
}
}
}
同样,当您单击发送按钮或要显示列表的最后一个元素的位置时,请使用 scrollToPosition ()。