【问题标题】:Android chatting app getMessages returns nullAndroid 聊天应用 getMessages 返回 null
【发布时间】:2021-09-29 15:49:09
【问题描述】:

我正在尝试在 android studio 中制作一个聊天应用程序。我已经部分完成了这个项目,但我遇到了这个错误,我无法弄清楚。问题是每当我使用.getMessage() 时,它都会返回一个空值。

代码如下

ChatAdapter.java

import android.content.Context;
import android.hardware.SensorManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.auth.FirebaseAuth;

import java.util.ArrayList;

public class ChatAdapter extends RecyclerView.Adapter{

    ArrayList<MessagesModel> messagesModels;
    Context context;
    int SENDER_VIEW_TYPE = 1;
    int RECEIVER_VIEW_TYPE = 2;

    public ChatAdapter(ArrayList<MessagesModel> messagesModels, Context context) {
        this.messagesModels = messagesModels;
        this.context = context;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == SENDER_VIEW_TYPE){
            View view = LayoutInflater.from(context).inflate(R.layout.sample_sender, parent,false);
            return  new SenverViewHolder(view);
        }
        else{
            View view = LayoutInflater.from(context).inflate(R.layout.sample_sender, parent,false);
            return  new ReceiverViewHolder(view);
        }

    }

    @Override
    public int getItemViewType(int position) {
       return  SENDER_VIEW_TYPE;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        MessagesModel messagesModel = messagesModels.get(position);
        System.out.println(messagesModel.getMessage());
        if (holder.getClass() == SenverViewHolder.class){
            ((SenverViewHolder)holder).senderMsg.setText(messagesModel.getMessage());
        }else {
            ((ReceiverViewHolder)holder).receiverMsg.setText(messagesModel.getMessage());
        }


    }

    @Override
    public int getItemCount() {
        return messagesModels.size();
    }

    public class ReceiverViewHolder extends RecyclerView.ViewHolder {
        TextView receiverMsg, receiverTime;
        public ReceiverViewHolder(@NonNull View itemView) {
            super(itemView);

            receiverMsg = itemView.findViewById(R.id.receiverText);
            receiverTime= itemView.findViewById(R.id.reciverTime);
        }
    }
    public class SenverViewHolder extends RecyclerView.ViewHolder {
        TextView senderMsg, senderTime;
        public SenverViewHolder(@NonNull View itemView) {
            super(itemView);

            senderMsg = itemView.findViewById(R.id.senderText);
            senderTime = itemView.findViewById(R.id.senderTime);
        }
    }
}

MessagesModel.java

public class MessagesModel {
    String uId,message;
    Long timestamp;
    public MessagesModel() {}

    public MessagesModel(String uID, String Message) {
        super();
        this.uId = uID;
        this.message = Message;
    }

    public String getuId() {
        return uId;
    }

    public void setuId(String uId) {
        this.uId = uId;
    }

    public String getMessage() {
        System.out.println("Message "+message);
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Long getTimestamp() { return timestamp; }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }
}

UsersAdapter.java

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

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

    ArrayList<Users> list;
    Context context;

    public UsersAdapter(ArrayList<Users> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.sample_show_user,parent,false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull UsersAdapter.ViewHolder holder, int position) {
        Users users = list.get(position);
        Picasso.get().load(users.getProfilepic()).placeholder(R.drawable.ic_baseline_supervised_user_circle_24).into(holder.image);
        holder.userName.setText(users.getUsername());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent( context, chatDetailedActivity.class);
                intent.putExtra("userId", users.getUserId("user"));
                intent.putExtra("profileic", users.getProfilepic());
                intent.putExtra("username", users.getUsername());
                context.startActivity(intent);


            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView image;
        TextView userName, lastMessage;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            image = itemView.findViewById(R.id.profile_image);
            userName = itemView.findViewById(R.id.userNameList);
            lastMessage = itemView.findViewById(R.id.lestMessage);
        }
    }

}

ChatDetailedActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import com.example.vroo.databinding.ActivityChatDetailedBinding;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class chatDetailedActivity extends AppCompatActivity {

    ActivityChatDetailedBinding binding;
    FirebaseDatabase database;
    FirebaseAuth auth;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityChatDetailedBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        database = FirebaseDatabase.getInstance();
        auth = FirebaseAuth.getInstance();

        final String senderId = auth.getUid();
        String receiveId = getIntent().getStringExtra("userId");
        String username = getIntent().getStringExtra("username");
        String profilePic = getIntent().getStringExtra("profileic");

        binding.ChatUsername.setText(username);
        Picasso.get().load(profilePic).placeholder(R.drawable.ic_baseline_supervised_user_circle_24).into(binding.profileImage);

        binding.backArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(chatDetailedActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });

        final ArrayList<MessagesModel> messagesModel = new ArrayList<>();
        final ChatAdapter chatAdapter = new ChatAdapter(messagesModel,this);
        binding.RecycleView.setAdapter(chatAdapter);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        binding.RecycleView.setLayoutManager(layoutManager);

        final String senderRoom = senderId + receiveId;
        final String receiverRoom = receiveId + senderId;

        database.getReference().child("chats").child(senderRoom).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                messagesModel.clear();
                for(DataSnapshot snapshot1:snapshot.getChildren()){
                    MessagesModel model = snapshot.getValue(MessagesModel.class);
                    messagesModel.add(model);
                }
                chatAdapter.notifyDataSetChanged();
            }

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

            }
        });
        binding.send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String message = binding.editTextTextMultiLine.getText().toString();
                final MessagesModel model = new MessagesModel(senderId,message);
                binding.editTextTextMultiLine.setText("");

                database.getReference().child("chats").child(senderRoom).push().setValue(model).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void unused) {
                        database.getReference().child("chats").child(receiverRoom).push().setValue(model).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void unused) {

                            }
                        });
                    }
                });
            }
        });
    }
}

数据库 JSON 文件

{
  "User" : {
    "7V43IzF3QBh4wtn3NG6gW0xxNR03" : {
      "mail" : "gelk@gmail.com",
      "password" : "4547777",
      "username" : "hello"
    },
    "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1" : {
      "mail" : "neil@gmail.com",
      "password" : "123456",
      "username" : "neil"
    },
    "iK6zuVXOSqNLGi75XmXaM16jrxI2" : {
      "mail" : "gkjkjkjelk@gmail.com",
      "password" : "4547777",
      "username" : "hejkllo"
    }
  },
  "chats" : {
    "7V43IzF3QBh4wtn3NG6gW0xxNR03PLYNSjgHfpMKZ3M2pVJcH2NqM5h1" : {
      "-MfCf3cXc0dsV3YsisbJ" : {
        "message" : "hi",
        "uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
      },
      "-MfCfedXfFIvM2bZ3iYe" : {
        "message" : "hi",
        "uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
      },
      "-MfCllAO6qaGFI7FD1ud" : {
        "message" : "hi"
      },
      "-MfCnnPUTYUh5OW21fws" : {
        "message" : "hi"
      }
    },
    "PLYNSjgHfpMKZ3M2pVJcH2NqM5h17V43IzF3QBh4wtn3NG6gW0xxNR03" : {
      "-MfCf3XpXtuQoUx1dKHh" : {
        "message" : "hi",
        "uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
      },
      "-MfCfeZ1ehufuG4dctXg" : {
        "message" : "hi",
        "uId" : "PLYNSjgHfpMKZ3M2pVJcH2NqM5h1"
      },
      "-MfCll4UCdk24rTpjStb" : {
        "message" : "hi"
      },
      "-MfCnnJafzuCg1ZTrCI1" : {
        "message" : "hi"
      }
    }
  }
}

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。
  • 您是否尝试将String uId,message; 设置为私有?
  • 然后呢? .getMessage() 是否仍然返回空值?
  • @AlexMamo 是的,当我打印它时它仍然返回空值这是我得到的 I/System.out: Message= null。
  • 你在哪一行代码中得到了空值?

标签: java android firebase android-studio


【解决方案1】:

根据您上次的评论,您说您得到以下输出:

I / System.out的:DataSnapshot {键= PLYNSjgHfpMKZ3M2pVJcH2NqM5h17V43IzF3QBh4wtn3NG6gW0xxNR03,值= {-MfD-d3u1WIo9LbSKAJW = {UID = PLYNSjgHfpMKZ3M2pVJcH2NqM5h1,消息=喜},-MfD0VV-DllCWZRKdnN1 = {UID = PLYNSjgHfpMKZ3M2pVJcH2NqM5h1,消息=喜},-MfD0XKsGFxPB7wAFk9k ={uId=PLYNSjgHfpMKZ3M2pVJcH2NqM5h1, message=如何解决}} }

表示问题出在以下代码行:

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
    messagesModel.clear();
    for(DataSnapshot snapshot1:snapshot.getChildren()){
        MessagesModel model = snapshot.getValue(MessagesModel.class);
        messagesModel.add(model);
     }
     chatAdapter.notifyDataSetChanged();
}

您在哪里循环了错误的DataSnapshot 对象。所以请更改以下行:

MessagesModel model = snapshot.getValue(MessagesModel.class);

收件人:

MessagesModel model = snapshot1.getValue(MessagesModel.class);
//                            ^

snapshot1 是正确的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多