首页 > 解决方案 > RecyclerView not scrolling with firebase

问题描述

I'm making a chat application that uses Firebase as a backend, but I'm having trouble getting the RecyclerView to scroll to the bottom of the list. I have a chatActivity that has the following methods:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        Id = getIntent().getExtras().getString("matchId");
        Pic = findViewById(R.id.displayImageMessages);
        thoughtButton = findViewById(R.id.messageThought);

        //SET MENU
        menuButton = findViewById(R.id.messageMenu);
        menuButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                optionMenu = new PopupMenu(ChatActivity.this,menuButton);
                optionMenu.getMenuInflater().inflate(R.menu.popup_menu2,optionMenu.getMenu());
                optionMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem menuItem) {
                        if(menuItem.getItemId() == R.id.one){
                            backtoMain();
                            return true;
                        }
                        else if (menuItem.getItemId() == R.id.two){

                            return true;
                        }
                        else if(menuItem.getItemId() == R.id.three){
                            FirebaseAuth auth = FirebaseAuth.getInstance();
                            auth.signOut();
                            backtoMenu();
                            return true;
                        }
                        else{
                            return false;
                        }
                    }

                });
                optionMenu.show();
            }
        });

       Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        //LOAD  PICTURE
        URI = getIntent().getExtras().getString("displayPic");
        Glide.with(this).load(URI).thumbnail(0.4f).into(Pic);
        //RETRIEVE CHAT
        currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
        databaseUser  = FirebaseDatabase.getInstance().getReference().child("users").child(currentUserID).child("connections").child(Id).child("ChatId");
        databaseChat  = FirebaseDatabase.getInstance().getReference().child("chat");
        getChatId();
        mSendEditText = findViewById(R.id.messageText);
        mSendButton = findViewById(R.id.send);
        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendMessage();
            }
        });
        mRecyclerView = (RecyclerView) findViewById(R.id.ChatRecycler);
        mRecyclerView.setNestedScrollingEnabled(true);
        mRecyclerView.setHasFixedSize(false);
        linearLayoutManager = new LinearLayoutManager(ChatActivity.this);
        mChatLayoutManager = linearLayoutManager;
        mRecyclerView.setLayoutManager(mChatLayoutManager);
        mChatAdapter = new ChatViewAdapter(getDataSetChat(),ChatActivity.this);
        mRecyclerView.setAdapter(mChatAdapter);
        mRecyclerView.addItemDecoration(new VerticalSpaceItemDecoration(20));



    }

and

  private void getChatId() {
        databaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()){
                    chatId = dataSnapshot.getValue().toString();
                    databaseChat = databaseChat.child(chatId);
                    getChatMessages();
                    linearLayoutManager.scrollToPositionWithOffset(resultsChat.size(),0);
                    Log.d("messageTAG",String.valueOf(mChatAdapter.getItemCount()));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

and

 private void getChatMessages() {

        databaseChat.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                if (dataSnapshot.exists()){
                    String message = null;
                    String createdbyuser = null;
                    long timestamp = 0;
                    if (dataSnapshot.child("text").getValue()!=null){
                        message = dataSnapshot.child("text").getValue().toString();
                    }
                    if (dataSnapshot.child("createdBy").getValue()!=null){
                        createdbyuser = dataSnapshot.child("createdBy").getValue().toString();
                    }
                    if (dataSnapshot.child("timestamp").getValue()!=null){
                        timestamp = Long.valueOf(dataSnapshot.child("timestamp").getValue().toString());
                    }
                    if (message!=null&&createdbyuser!=null){
                        Boolean currentUserBoolean = false;
                        if (createdbyuser.equals(currentUserID)){
                            currentUserBoolean = true;
                        }

                        ChatObject newMessage = new ChatObject(message,currentUserBoolean,timestamp);
                        resultsChat.add(newMessage);
                        mChatAdapter.notifyDataSetChanged();
                    }

                    //SETS VISABILITY OF THOUGHTS BUTTON IF CHAT SIZE IS ABOVE 10
                    if(resultsChat.size() > 10){
                        thoughtButton.setVisibility(View.VISIBLE);
                    }

                }

            }

I've tried various layoutManager.ScrollToPosition or adapter.ScrollToPosition etc, but I'd appreciate any thoughts you have on this problem?

标签: androidfirebasefirebase-realtime-databaseandroid-recyclerview

解决方案


Try using

mRecyclerView.scrollToPosition(resultsChat.size() - 1);

In databaseChat.addChildEventListener()

Like this :

ChatObject newMessage = new ChatObject(message,currentUserBoolean,timestamp);
resultsChat.add(newMessage);
mRecyclerView.scrollToPosition(resultsChat.size() - 1); //here
mChatAdapter.notifyDataSetChanged();

推荐阅读