5

im разрабатывает андроид-чат с использованием firebase.Android Firebase chat RecyclerView автоматически прокручивает вниз, когда добавляется новый элемент

Я попытался исследовать эту проблему, но я не могу найти хорошие решения.

надеюсь кто-то может мне помочь.

моя проблема: я хочу, чтобы 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); 

} 

ответ

13

Посмотрите step 6 of the Firebase codelab for 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); 
     } 
    } 
}); 
+0

отлично .. спасибо .. – Joehamir

+0

Это прокрутит, если вы добавите 1 новое сообщение. если у вас есть 6 непрочитанных сообщений, и вы нажимаете, чтобы прочитать их, в нем появится первое непрочитанное сообщение, а остальные 5 вам придется прокручивать вручную, чтобы просмотреть снизу – AlwaysConfused

1

Просто попробуйте ниже код:

  @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

где добавить этот код? – Joehamir

+0

После установки адаптера в RecyclerView и ниже добавьте его. –

+0

не может решить setSelection и getCount .. – Joehamir