添加新项目时,Android Firebase聊天RecyclerView自动滚动到底部 [英] Android Firebase chat RecyclerView auto scroll to bottom when new item is added

查看:830
本文介绍了添加新项目时,Android Firebase聊天RecyclerView自动滚动到底部的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图研究这个问题,但我找不到一个好的解决方案。


$开发一个使用firebase的android聊天。

b $ b

希望有人可以帮助我。



我的问题我希望RecyclerView自动滚动,如果添加新项目。


$ $ $
$覆盖
public View

这里是我的代码。 onCreateView(LayoutInflater inflater,ViewGroup容器,Bundle savedInstanceState){
查看rootView = inflater.inflate(R.layout.chatlayoutchat,container,false);

连接连通性= new Connectivity();
if(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 $ b $ public void onChildAdded(DataSnapshot dataSnapshot,String s){
ChatModel chatmsg = dataSnapshot.getValue(ChatModel.class);
chatmsgsList.add(chatmsg);
}
$ b $ @覆盖
public void onChildChanged(DataSnapshot dataSnapshot,String s){

}

@Override
public void onChildRemoved(DataSnapshot dataSnapshot){


$ b @Override
public void onChildMoved(DataSnapshot dataSnapshot,String s){

}
$ b $ @覆盖
public void onCancelled(FirebaseError firebaseError){

}
});
$ b}

} 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){


$ b $ chatMessageViewHolder.sender.setText(m.getSender());
chatMessageViewHolder.msg.setText(m.getMessage());

}
};
mRecyclerView.setAdapter(mFirebaseAdapter1);

$ b $ / code>


解决方案

请参阅 Firebase for Android的第6步,它使用 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(lastVisiblePosition == -1 ||
(positionStart> =(friendlyMessageCount-1)&&
lastVisiblePosition ==(positionStart - 1))){
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});


im developing an android chat using firebase.

i tried to research about this problem but i cant find a good solutions.

hope someone can help me.

my problem i want the RecyclerView to auto scroll if new item is added.

here is my code.

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

}

解决方案

Have a look at step 6 of the Firebase codelab for Android, which uses an AdapterDataObserver for this:

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

这篇关于添加新项目时,Android Firebase聊天RecyclerView自动滚动到底部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆