Опорного пункта Android чат RecyclerView автоматическая прокрутка вниз при добавлении нового элемента
Я разрабатываю чат для android с помощью firebase.
Я пытался исследовать эту проблему, но не могу найти хорошего решения.
Надеюсь, кто-нибудь сможет мне помочь.
Моя проблема я хочу, чтобы RecyclerView автоматически прокручивался, если добавлен новый элемент.
Вот мой код.
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.chatlayoutchat, container, false);
Connectivity connectivity=new Connectivity();
if(connectivity.isConnected(getActivity())) {
if(getArguments() != null) {
Firebase.setAndroidContext(this.getActivity());
String ccustomersid = getArguments().getString("customersid");
String creferralae = getArguments().getString("referralae");
String ccustomersname = getArguments().getString("customersname");
customersid = ccustomersid;
referralae = creferralae;
customersname = ccustomersname;
Firebase.setAndroidContext(this.getActivity());
editText = (EditText) rootView.findViewById(R.id.editText);
sendbutton = (Button) rootView.findViewById(R.id.button);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutmgr = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(layoutmgr);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
//linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(linearLayoutManager);
from_user = customersid;
to_user = referralae;
LoggedInUser = customersname;
//Log.v("NODE CREATED:", from_user + " " + to_user);
ref_chatchildnode1 = firebase_chatnode.child(from_user + " " + to_user);
//ref_chatchildnode2 = firebase_chatnode.child(to_user + " " + from_user);
sendbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
newmsg = editText.getText().toString().trim();
ChatModel m = new ChatModel();
m.setSender(LoggedInUser);
m.setMessage(newmsg);
ref_chatchildnode1.push().setValue(m);
//ref_chatchildnode2.push().setValue(m);
editText.setText("");
}
});
ref_chatchildnode1.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ChatModel chatmsg = dataSnapshot.getValue(ChatModel.class);
chatmsgsList.add(chatmsg);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
}else{
nointernet();
}
showGlobalContextActionBar();
return rootView;
}
@Override
public void onStart() {
super.onStart();
mFirebaseAdapter1 = new FirebaseRecyclerAdapter<ChatModel, ChatMessageViewHolder>(ChatModel.class,
R.layout.textview,
ChatMessageViewHolder.class,
ref_chatchildnode1) {
@Override
protected void populateViewHolder(ChatMessageViewHolder chatMessageViewHolder, ChatModel m, int i) {
chatMessageViewHolder.sender.setText(m.getSender());
chatMessageViewHolder.msg.setText(m.getMessage());
}
};
mRecyclerView.setAdapter(mFirebaseAdapter1);
}
2 ответов:
Посмотрите на Шаг 6 кодовой таблицы Firebase для Android , которая использует
AdapterDataObserverдля этого:mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); int friendlyMessageCount = mFirebaseAdapter.getItemCount(); int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition(); // If the recycler view is initially being loaded or the // user is at the bottom of the list, scroll to the bottom // of the list to show the newly added message. if (lastVisiblePosition == -1 || (positionStart >= (friendlyMessageCount - 1) && lastVisiblePosition == (positionStart - 1))) { mMessageRecyclerView.scrollToPosition(positionStart); } } });
Просто попробуйте ниже кода:
@Override public void onStart() { super.onStart(); mFirebaseAdapter1 = new FirebaseRecyclerAdapter<ChatModel, ChatMessageViewHolder>(ChatModel.class, R.layout.textview, ChatMessageViewHolder.class, ref_chatchildnode1) { @Override protected void populateViewHolder(ChatMessageViewHolder chatMessageViewHolder, ChatModel m, int i) { chatMessageViewHolder.sender.setText(m.getSender()); chatMessageViewHolder.msg.setText(m.getMessage()); } }; mRecyclerView.setAdapter(mFirebaseAdapter1); if (mFirebaseAdapter1 != null) { mRecyclerView.postDelayed(new Runnable() { @Override public void run() { mRecyclerView.smoothScrollToPosition(mFirebaseAdapter1.getItemCount() - 1); } }, 5); } }
Comments