5

im phát triển trò chuyện Android bằng firebase.Trò chuyện Firebase trên Android RecyclerXem tự động cuộn xuống dưới cùng khi mục mới được thêm

tôi đã cố gắng nghiên cứu về vấn đề này nhưng tôi không thể tìm thấy một giải pháp tốt.

hy vọng ai đó có thể giúp tôi.

vấn đề của tôi, tôi muốn RecyclerView tự động cuộn nếu mục mới được thêm vào.

đây là mã của tôi.

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

} 

Trả lời

13

Có một cái nhìn tại step 6 of the Firebase codelab for Android, trong đó sử dụng một AdapterDataObserver cho việc này:

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

hoàn hảo .. cảm ơn .. – Joehamir

+0

Điều đó sẽ cuộn nếu bạn thêm 1 tin nhắn mới. nếu bạn có 6 thư chưa đọc và bạn bấm để đọc chúng, nó sẽ hiển thị thư chưa đọc đầu tiên và phần còn lại 5 bạn sẽ phải cuộn theo cách thủ công để xem ở dưới cùng – AlwaysConfused

1

Chỉ cần cố gắng bên dưới mã:

  @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

nơi để thêm mã này? – Joehamir

+0

Sau khi thiết lập bộ điều hợp trong RecyclerView và dưới đây thêm nó. –

+0

không thể giải quyết setSelection và getCount .. – Joehamir

Các vấn đề liên quan