简体   繁体   English

无法将来自 firebase 实时数据库的消息显示到 recyclerview

[英]Unable to show message from firebase realtime database on to recyclerview

I am trying to create a messaging app.我正在尝试创建一个消息应用程序。 Till now my code worked fine but now I am facing an error while sending messages to the user when I try to send a message from one user to another my messages get updated in the Realtime database but it doesn't show in the RecyclerView .到目前为止,我的代码运行良好,但现在我在向用户发送消息时遇到错误,当我尝试从一个用户向另一个用户发送消息时,我的消息在实时数据库中得到更新,但它没有显示在RecyclerView But When I previously don't have any messages in my database It works fine but after clicking on sending my app crashes.但是当我以前在我的数据库中没有任何消息时它工作正常但是在单击发送我的应用程序崩溃后。

Database screenshot数据库截图

It shows error in following line它在以下行中显示错误

               if (chat.getReciver().equals(myid) && chat.getSender().equals(userid)||
                    chat.getReciver().equals(userid)&&chat.getSender().equals(myid)){
                mChat.add(chat);
            }

And the error which I get in logcat window is我在 logcat 窗口中得到的错误是

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference at com.shivam.chatapp2.MessageActivity$4.onDataChange(MessageActivity.java:148) java.lang.NullPointerException:尝试在 com.shivam.chatapp2.MessageActivity$4.onDataChange(MessageActivity.java:148) 的空对象引用上调用虚拟方法“布尔型 java.lang.String.equals(java.lang.Object)” )

My full code我的完整代码

MessageActivity.java消息活动.java

    public class MessageActivity extends AppCompatActivity {
    CircleImageView profile_image;
    TextView user_name;

    FirebaseFirestore fstore;
    FirebaseAuth fAuth;
    FirebaseUser fuser;
    DatabaseReference reference;

    Toolbar toolbar;
    ImageButton imageButton;
    EditText textsend;
    String userID;

    MessageAdapter messageAdapter;
    List<Chat> mChat;
    RecyclerView recyclerView;



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

        fAuth=FirebaseAuth.getInstance();
        fstore=FirebaseFirestore.getInstance();
        userID = fAuth.getCurrentUser().getUid();


        profile_image=findViewById(R.id.profile_image);
        user_name=findViewById(R.id.username);
        imageButton=findViewById(R.id.btn_send);
        textsend=findViewById(R.id.text_send);

        recyclerView=findViewById(R.id.recycler_view2);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager= new LinearLayoutManager(getApplicationContext());
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);

        toolbar=findViewById(R.id.myToolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        Intent intent=getIntent();
        fuser=FirebaseAuth.getInstance().getCurrentUser();

        String userid=intent.getStringExtra("userid");
        String username= intent.getStringExtra("UserName");
        reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                user_name.setText(user.getFirst());

                readMessages(fuser.getUid(), userid);
            }

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

            }
        });


        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg=textsend.getText().toString();
                if (!msg.equals("")){
                    sendMessage(fuser.getUid(),userid,msg);
                }
                else {
                    Toast.makeText(MessageActivity.this,"Empty messages cant be send",Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    private void sendMessage(String sender, final String receiver, String message) {

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("sender", sender);
        hashMap.put("receiver", receiver);
        hashMap.put("message", message);

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
        reference.child("Chats").push().setValue(hashMap);

    }
    private void readMessages(String myid,String userid){
        mChat=new ArrayList<>();
        reference=FirebaseDatabase.getInstance().getReference("Chats");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mChat.clear();
                for (DataSnapshot snapshot:dataSnapshot.getChildren()) {
                    Chat chat=snapshot.getValue(Chat.class);
                    assert chat != null;
                    if (chat.getReciver().equals(myid) && chat.getSender().equals(userid)||
                            chat.getReciver().equals(userid)&&chat.getSender().equals(myid)){
                        mChat.add(chat);
                    }
                    messageAdapter=new MessageAdapter(MessageActivity.this,mChat);
                    recyclerView.setAdapter(messageAdapter);

                }
            }

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

            }
        });

    }
}

MessageAdapter.java消息适配器.java

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {

    public static  final int MSG_TYPE_LEFT = 0;
    public static  final int MSG_TYPE_RIGHT = 1;

    private Context mContext;
    private List<Chat> mChat;

    FirebaseUser fuser;

    public MessageAdapter() {
    }

    public MessageAdapter(Context mContext, List<Chat> mChat) {
        this.mContext = mContext;
        this.mChat = mChat;

    }

    @NonNull
    @Override
    public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == MSG_TYPE_RIGHT) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_right, parent, false);

            return new MessageAdapter.ViewHolder(view);
        }
        else {
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_left, parent, false);

            return new MessageAdapter.ViewHolder(view);

        }
    }

    @Override
    public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {

        Chat chat=mChat.get(position);
        holder.show_message.setText(chat.getMessage());




    }

    @Override
    public int getItemCount() {
        return mChat.size();
        }
    public class ViewHolder extends RecyclerView.ViewHolder{

         public TextView show_message;
         //public ImageView profile_image;

        public ViewHolder(@NonNull View itemView) {
        super(itemView);
        show_message=itemView.findViewById(R.id.username);
        //profile_image=itemView.findViewById(R.id.profile_image);

        }
    }

    @Override
    public int getItemViewType(int position) {
        fuser= FirebaseAuth.getInstance().getCurrentUser();
        if (mChat.get(position).getSender().equals(fuser.getUid())){
            return MSG_TYPE_RIGHT;
        }
        else {
            return MSG_TYPE_LEFT;
        }
    }
}

Chat.java聊天工具

public class Chat {
    private String sender;
    private String reciver;
    private  String message;

    public Chat(String sender, String reciver, String message) {
        this.sender = sender;
        this.reciver = reciver;
        this.message = message;
    }

    public Chat() {
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getReciver() {
        return reciver;
    }

    public void setReciver(String reciver) {
        this.reciver = reciver;
    }

    public String getMessage() {
        return message;
    }

The problem in your code is the reciver property in your Chat class.您代码中的问题是Chat类中的reciver属性。 This property should be named receiver , as it is in your database:此属性应命名为receiver ,因为它在您的数据库中:

在此处输入图片说明

So to solve this, please change your Chat class to:因此,要解决此问题,请将您的Chat类更改为:

public class Chat {
    private String sender;
    private String receiver;
    private String message;

    public Chat(String sender, String receiver, String message) {
        this.sender = sender;
        this.receiver = receiver;
        this.message = message;
    }

    public Chat() {
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    public String getMessage() {
        return message;
    }
}

你忘记在 textSend editText 上调用 setText

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法显示来自 Firebase 实时数据库的最后一条消息 - Unable to show last message from Firebase Realtime DataBase 无法在 Android 中显示来自 Firebase 实时数据库的随机数据 - Unable to show random data from Firebase Realtime Database in Android Firebase无法显示实时数据库中的名称 - Firebase unable to display name from realtime database 从 Firebase 实时数据库获取的数据未显示在我的 RecyclerView 中 - Data fetched from Firebase Realtime Database is not displayed in my RecyclerView 难以获得Realty RecyclerView FirebaseUI android显示来自数据库的消息 - Difficulties getting Realtime RecyclerView FirebaseUI android to show messages from database Firebase 实时数据库未在 Recyclerview 中显示图像 - Firebase Realtime Database not displaying images in Recyclerview 无法将数据从Firebase实时数据库检索到Web应用程序 - Unable to retrieve data from firebase realtime database into web app 如何从 Firebase 实时数据库获取数据并将其显示在微调器中? - How to get data from Firebase Realtime Database and show it in a spinner? 如何使用Android Firebase-realtime-database中的CardView在RecyclerView中显示数据? - How to display data in RecyclerView with CardView from Android firebase-realtime-database? 我正在尝试将 firebase 实时数据库中的数据检索到我的 recyclerview 中,但数据显示 null - I am trying to retrieve data from firebase realtime database into my recyclerview but data is showing null
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM