チャット アプリケーションのように、メッセージを送信するたびにソフト キーパッド ポップアップが表示され、ソフト キーパッドの後ろに何も隠れていない限り、最後に表示されたメッセージがソフト キーパッドの上部に自動スクロールされます。しかし、私の場合、キーパッドは会話を隠します。この問題を修正する方法と、メッセージを表示するためのリサイクラー ビューを使用しました。使ったandroid.support.v7.widget.RecyclerView
3 に答える
これを処理する方法は非常に単純で、Whatsapp やその他の一般的なチャットと同様に、1 つの適切な動作を実現します。
まず、LinearLayoutManager
このように設定します。
new LinearLayoutManager(this.getContext(), LinearLayoutManager.VERTICAL, true);
chatLayoutManager.setStackFromEnd(true);
メッセージが最下部でオーバーフローし始めるとRecyclerView
、現在の位置を 0 に設定する必要があります。これを実現するには、単純なインターフェイスが魔法のように機能しRecyclerView.Adapter
、最後のメッセージがレンダリングされたときに警告します。
public interface OnLastItemRendered{
void lastItemRendered();
}
インターフェイスの実装をアクティビティ/フラグメントから de に渡してでRecyclerView.Adapter
呼び出します。scrollToPosition
RecyclerView
new ChatMessageListAdapter(
context, user, lastOldMessages,
new OnLastItemRendered() {
@Override
public void lastItemRendered() {
ContainerFragment.this.myRecyclerViewToChat.scrollToPosition(0);
}
});
最後に、 でアニメーションを実行する場合は、メソッドの呼び出しの最後にRecyclerView
メッセージを追加するメソッドを 1 つ実装します。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 () を使用します。