我是编码新手我正在制作一个聊天应用程序,但我的聊天消息活动有问题。获取错误 E/RecyclerView:未连接适配器

时间:2021-04-03 22:16:37

标签: java android firebase android-recyclerview

我一直在关注 youtube 上的教程,直到现在它一直很顺利。我想我需要重新审视这个问题,因为我就是想不通。

它说没有设置适配器,但它看起来是为我设置的

这是我的聊天消息活动

package com.example.chatapp2;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import org.jetbrains.annotations.NotNull;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class ChatMessageActivity extends AppCompatActivity {

    private RecyclerView user_chat_recycler;
    private EditText user_chat_messageBox;
    private ImageButton user_chat_sendBtn;
    private Calendar calendar;
    private String positionKeyFriend, positionKeyMsg, friendUserName;

    private DatabaseReference user_chat_chatMsgRef, user_chat_usernameRef;
    private FirebaseDatabase firebaseDatabase;
    private FirebaseRecyclerAdapter firebaseRecyclerAdapter;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat_message);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        //get friends userID that is passed through fragment
        positionKeyFriend = getIntent().getStringExtra("userid");


        user_chat_recycler = findViewById(R.id.chat_message_recyclerView);
        user_chat_recycler.hasFixedSize();
        user_chat_recycler.setLayoutManager(new LinearLayoutManager(getApplicationContext()));


        calendar = Calendar.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();
        user_chat_messageBox = findViewById(R.id.chat_message_messageBox);
        user_chat_sendBtn = findViewById(R.id.chat_message_sendBtn);


        //define database ref for chat msg
        user_chat_chatMsgRef = firebaseDatabase.getReference("chats")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child(positionKeyFriend);


        //get name ref of the other user in the database
        user_chat_usernameRef = firebaseDatabase.getReference("Registered Users");

        //fetch the friends name from the database
        user_chat_usernameRef.child(positionKeyFriend)
                .child("chFirstName").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                if (snapshot.exists()){
                    friendUserName = snapshot.getValue().toString();
                    //set activity title to the friends username
                    setTitle(friendUserName);


                }
            }

            @Override
            public void onCancelled(@NonNull @NotNull DatabaseError error) {

                Toast.makeText(ChatMessageActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();

            }

        });

        user_chat_sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userChatMsg = user_chat_messageBox.getText().toString();
                if (userChatMsg.equals("")){
                    Toast.makeText(ChatMessageActivity.this, "Message is empty", Toast.LENGTH_SHORT).show();

                }else {
                    // get our user name
                    user_chat_usernameRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            .child("chFirstName").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                            if (snapshot.exists()){
                                String myUserName = snapshot.getValue().toString();

                                //get current time
                                DateFormat dateFormat = new SimpleDateFormat("HH:mm");
                                String time = dateFormat.format(calendar.getTime());

                                String message = user_chat_messageBox.getText().toString();
                                SendUser(message, time, myUserName);

                                Toast.makeText(ChatMessageActivity.this, message + " " + time + " " + myUserName, Toast.LENGTH_SHORT).show();
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull @NotNull DatabaseError error) {

                        }
                    });
                }
            }
        });

        //retrieve chat by ref
        user_chat_chatMsgRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
                if (snapshot.exists()){
                    RetrieveChatMessage();
                }
            }

            @Override
            public void onCancelled(@NonNull @NotNull DatabaseError error) {

                Toast.makeText(ChatMessageActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

    }

    //back button


    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                //kill this activity when back is pressed
                finish();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void RetrieveChatMessage(){
         final FirebaseRecyclerAdapter<sendUserChatRecieveClass, user_chat_ViewHolder> firebaseRecyclerAdapter = new
                 FirebaseRecyclerAdapter<sendUserChatRecieveClass, user_chat_ViewHolder>
                        (sendUserChatRecieveClass.class, R.layout.cardview_sentchat, user_chat_ViewHolder.class, user_chat_chatMsgRef) {
                    @Override
                    protected void populateViewHolder(user_chat_ViewHolder holder, sendUserChatRecieveClass model, int position) {

                        positionKeyMsg= model.getUserID();

                        if (positionKeyMsg.equals(positionKeyFriend)){
                            holder.ChangeOrientationLeft();
                        }else {
                            holder.ChangeOrientationRight();
                        }

                        holder.LastMessage(model.getMessage());
                        holder.userTime(model.getTime());

                    }
                };
        user_chat_recycler.setAdapter(firebaseRecyclerAdapter);
    }

    //send chat message over database
    private void SendUser(String message, String time, String myUserName) {
        user_chat_messageBox.setText("");

        DatabaseReference myFriendLastMessageRef = firebaseDatabase.getReference("last message")
                .child(positionKeyFriend).child(FirebaseAuth.getInstance().getCurrentUser().getUid());

        DatabaseReference myOwnMsgRef = firebaseDatabase.getReference("last message")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(positionKeyFriend);


        DatabaseReference friendReceiveMsgRef = firebaseDatabase.getReference("chat message")
                .child(positionKeyFriend).child(FirebaseAuth.getInstance().getCurrentUser().getUid());

        DatabaseReference myReceiveMsgRef = firebaseDatabase.getReference("chat message")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(positionKeyFriend);

        //update my last msg of friend
        retrieveChatMessageClass lastMsg = new retrieveChatMessageClass(myUserName, message, time);

        myFriendLastMessageRef.setValue(lastMsg).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull @NotNull Exception e) {
                Toast.makeText(ChatMessageActivity.this, "Message could not be delivered", Toast.LENGTH_SHORT).show();

            }
        });

        retrieveChatMessageClass myOwnMsg = new retrieveChatMessageClass(friendUserName, message, time);

        myOwnMsgRef.setValue(myOwnMsg).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull @NotNull Exception e) {
                Toast.makeText(ChatMessageActivity.this, "Message could not be sent", Toast.LENGTH_SHORT).show();

            }
        });

        //update friends received message
        sendUserChatRecieveClass friendMsg = new sendUserChatRecieveClass(FirebaseAuth
                .getInstance().getCurrentUser().getUid(), message, time);
        friendReceiveMsgRef.push().setValue(friendMsg).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull @NotNull Exception e) {
                Toast.makeText(ChatMessageActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
        //update my received message
        sendUserChatRecieveClass myClassMsg = new sendUserChatRecieveClass(FirebaseAuth
                .getInstance().getCurrentUser().getUid(), message, time);
        myReceiveMsgRef.push().setValue(myClassMsg).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull @NotNull Exception e) {
                Toast.makeText(ChatMessageActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

    }

    public static class user_chat_ViewHolder extends RecyclerView.ViewHolder{
        View myView;

        public user_chat_ViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);
            myView = itemView;
        }

        public void LastMessage(String Message){
            TextView user_chat_sentMessage = myView.findViewById(R.id.sent_chat_message);
            user_chat_sentMessage.setText(Message);
            Toast.makeText(myView.getContext(), Message, Toast.LENGTH_SHORT).show();
        }
        public void userTime(String Time){
            TextView user_chat_sentTime =myView.findViewById(R.id.sent_chat_time);
            user_chat_sentTime.setText(Time);
        }
        @SuppressLint("NewApi")
        public void ChangeOrientationLeft(){
            LinearLayout cardView =myView.findViewById(R.id.sent_chat_layout);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT
            , FrameLayout.LayoutParams.WRAP_CONTENT);

                params.setMarginEnd(100);
                cardView.setLayoutParams(params);
                cardView.setBackground(ContextCompat.getDrawable(myView.getContext(), R.drawable.layout_bg_white));


        }
        @SuppressLint("NewApi")
        public void ChangeOrientationRight(){
            LinearLayout cardView =myView.findViewById(R.id.sent_chat_layout);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT
                    , FrameLayout.LayoutParams.WRAP_CONTENT);

                params.setMarginStart(100);
                cardView.setLayoutParams(params);
                cardView.setBackground(ContextCompat.getDrawable(myView.getContext(), R.drawable.layout_bg_green));


        }
    }
}

我知道我设置了适配器我无法弄清楚。我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:-1)

我想我知道你的问题是什么。

您正在RetrieveChatMessage 方法中设置适配器,但是!该方法永远不会被调用,基本上我的理论是您的验证:

if (snapshot.exists()){
    RetrieveChatMessage();
}

永远true,这会阻止您的方法 RetrieveChatMessage 被调用,这就是为什么您的 RecyclerView 永远不会分配适配器。

请在 ValueEventListener 的回调 onDataChange 中调试您的代码,看看 snapshot.exists() 是否永远true< /strong> 确保并让我们知道 :)