5

przy tworzeniu czatu Android za pomocą firebase.Android Firebase chat RecyclerView automatycznie przewiń do dołu po dodaniu nowego elementu

Próbowałem zbadać ten problem, ale nie mogę znaleźć dobrych rozwiązań.

nadzieję, że ktoś może mi pomóc.

Mój problem Chcę, aby funkcja RecyclerView automatycznie przewijała po dodaniu nowego elementu.

Oto mój kod.

@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); 

} 

Odpowiedz

13

Wystarczy popatrzeć na step 6 of the Firebase codelab for Android, który wykorzystuje AdapterDataObserver dla tego:

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); 
     } 
    } 
}); 
+0

perfect .. thanks .. – Joehamir

+0

Zostanie przewinięte, jeśli dodasz 1 nową wiadomość. jeśli masz 6 nieprzeczytanych wiadomości i klikniesz, aby je przeczytać, pokaże się pierwsza nieprzeczytana wiadomość, a reszta 5 będziesz musiał ręcznie przewinąć, aby zobaczyć na dole – AlwaysConfused

1

Spróbuj poniżej kodu:

  @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); 
       } 
      } 
+0

gdzie umieścić ten kod? – Joehamir

+0

Po ustawieniu adaptera w widoku RecyclerView i poniżej dodaj go. –

+0

nie może rozwiązać setSelection i getCount .. – Joehamir