【问题标题】:Sender & Receiver view is not created in my chat Application我的聊天应用程序中未创建发件人和收件人视图
【发布时间】:2022-01-05 08:26:57
【问题描述】:

我的发送者消息和接收者消息只在发送消息中发送,在接收视图中没有。

我添加了以下代码

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

            chatAdapter.notifyDataSetChanged();
       }

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

       }
   });

但每次我发送新消息时,应用程序都会给出“应用程序没有响应”的错误

然后,正如我所说,所有发送的消息都出现在发送者视图中,而不是接收者视图中。 这是错误:

E/AndroidRuntime: 致命异常: main 进程:myapp.files.memochatting,PID:23966 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)” 在 myapp.files.memochatting.Adapter.ChatAdapter.onBindViewHolder(ChatAdapter.java:81)

他指的第(81)行是:

viewHolder.senderMsg.setText(messageModel.getMessage());

我的数据库如下所示:

{
  "Users" : {
    "9tDjCkxCnISIzOS1TvHmGwgFSG93" : {
      "email" : "maha@gmail.com",
      "password" : "123456789",
      "userName" : "maha"
    },
    "PJFr3Lw0EcWLN275GdOqSDHR76D2" : {
      "email" : "asmaa.11@gmail.com",
      "password" : "123456789",
      "userName" : "Asmaa"
    },
    "T9oPNFhHVadWySFt0ILA6D6XRRm1" : {
      "email" : "ahmed@gmail.com",
      "password" : "123456789",
      "userName" : "ahmed"
    },
    "WtO1EJijSfgeF9JsVsMG7ZOSbjP2" : {
      "profilePic" : "https://lh3.googleusercontent.com/a-/AOh14GggNZN75jHuTl1ZB5ZuQm26aXbT4DvLFGX1_OE0Kw=s96-c",
      "userId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2",
      "userName" : "Maha Abd El-Moneam"
    },
    "moTrPYohePOFiX7kSLzOVYdbq1F2" : {
      "email" : "mohamed@gmail.com",
      "password" : "123456789",
      "userName" : "mohamed"
    }
  },
  "chats" : {
    "9tDjCkxCnISIzOS1TvHmGwgFSG93PJFr3Lw0EcWLN275GdOqSDHR76D2" : {
      "-MsdYoWZISiMbPaCDgLC" : {
        "message" : "hello maha, I'm asmaa",
        "timestamp" : 1641374739108,
        "uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
      },
      "-Msd_2cuQOPDrU8G7_vS" : {
        "message" : "hi asmaa",
        "timestamp" : 1641375063018,
        "uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
      }
    },
    "9tDjCkxCnISIzOS1TvHmGwgFSG93WtO1EJijSfgeF9JsVsMG7ZOSbjP2" : {
      "-MsdIrPbq7PFLRFSD-Pa" : {
        "message" : "hellow from me",
        "timestamp" : 1641370555853,
        "uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
      },
      "-MsdIvG06F3EgjtdTzEY" : {
        "message" : "please receive",
        "timestamp" : 1641370570841,
        "uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
      },
      "-MsdWGk0UBnm0Nch14uG" : {
        "message" : "hello",
        "timestamp" : 1641374072522,
        "uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
      },
      "-MsdWukKtbmNNE8-lrPu" : {
        "message" : "hi maha.gmail",
        "timestamp" : 1641374240472,
        "uId" : "9tDjCkxCnISIzOS1TvHmGwgFSG93"
      }
    },
    "T9oPNFhHVadWySFt0ILA6D6XRRm1null" : {
      "-MsKNncf-SlE2I-hwsj6" : {
        "message" : "hello ahmed",
        "timestamp" : 1641036308698
      }
    },
    "WtO1EJijSfgeF9JsVsMG7ZOSbjP29tDjCkxCnISIzOS1TvHmGwgFSG93" : {
      "-MsdIrEwWMoEep3buSCK" : {
        "message" : "hellow from me",
        "timestamp" : 1641370555853,
        "uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
      },
      "-MsdIuv8E0e74zv_WyY4" : {
        "message" : "please receive",
        "timestamp" : 1641370570841,
        "uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
      },
      "-MsdXVMa8zEt_sB0unfP" : {
        "message" : "from maha to mahagmail",
        "timestamp" : 1641374394307,
        "uId" : "WtO1EJijSfgeF9JsVsMG7ZOSbjP2"
      }
    },
    "WtO1EJijSfgeF9JsVsMG7ZOSbjP2null" : {
      "-MsKNk5TBVnuhZikCdSs" : {
        "message" : "hi maha",
        "timestamp" : 1641036294080
      },
      "-MsdBScowXAo-Tti8zcM" : {
        "message" : "please",
        "timestamp" : 1641368615680
      }
    },
    "nullT9oPNFhHVadWySFt0ILA6D6XRRm1" : {
      "-MsKNnZQJNBVNdusyFax" : {
        "message" : "hello ahmed",
        "timestamp" : 1641036308698
      }
    },
    "nullWtO1EJijSfgeF9JsVsMG7ZOSbjP2" : {
      "-MsKNk-6YSAToqGxhD9O" : {
        "message" : "hi maha",
        "timestamp" : 1641036294080
      },
      "-MsdBSYC9LlNfrcaETS2" : {
        "message" : "please",
        "timestamp" : 1641368615680
      }
    }
  }
}
public class MessageModel {

    String uId, message, messageId;
    Long timestamp;


    public MessageModel(String uId, String message, Long timestamp) {
        this.uId = uId;
        this.message = message;
        this.timestamp = timestamp;
    }

    public MessageModel(String uId, String message) {
        this.uId = uId;
        this.message = message;
    }

    public MessageModel(){

    }

    public String getuId() {
        return uId;
    }

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

    public String getMessage() {
        return message;
    }

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

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }
}
public class ChatAdapter extends RecyclerView.Adapter {

    ArrayList<MessageModel> messageModels;
    Context context;
    String recId;

    int SENDER_VIEW_TYPE = 1;
    int RECEIVER_VIEW_TYPE = 2;



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

    public ChatAdapter(ArrayList<MessageModel> messageModels, Context context, String recId) {
        this.messageModels = messageModels;
        this.context = context;
        this.recId = recId;
    }

    @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 SenderViewHolder(view);
        }
        else
        {
            View view = LayoutInflater.from(context).inflate(R.layout.sample_receiver,parent,false);
            return new ReceiverViewHolder(view);
        }


    }

    @Override
    public int getItemViewType(int position) {

        if(messageModels.get(position).getuId() == (FirebaseAuth.getInstance().getUid()))
        {
            return SENDER_VIEW_TYPE;

        }
        else
        {
            return RECEIVER_VIEW_TYPE;
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        MessageModel messageModel = messageModels.get(position);

        if (holder.getClass() == SenderViewHolder.class)
        {
            SenderViewHolder viewHolder = (SenderViewHolder) holder;
            viewHolder.senderMsg.setText(messageModel.getMessage());

        }
        else
        {
            ReceiverViewHolder viewHolder = (ReceiverViewHolder) holder;
            viewHolder.receiverMsg.setText(messageModel.getMessage());

        }

    }

    @Override
    public int getItemCount() {
        return messageModels.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.receiverTime);

        }
    }

    public class SenderViewHolder extends RecyclerView.ViewHolder{

        TextView senderMsg, senderTime;

        public SenderViewHolder(@NonNull View itemView) {
            super(itemView);

            senderMsg = itemView.findViewById(R.id.receiverText);
            senderTime = itemView.findViewById(R.id.senderTime);

        }
    }
}
public class ChatDetailActivity extends AppCompatActivity {

    ActivityChatDetailBinding binding;
    FirebaseDatabase database;
    FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityChatDetailBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

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

        final String senderId = auth.getUid();
        String recieveId = getIntent().getStringExtra("userId");
        String userName = getIntent().getStringExtra("userName");
        String profilePic = getIntent().getStringExtra("profilePic");

        binding.userName.setText(userName);
        Picasso.get().load(profilePic).placeholder(R.drawable.ic_avatar).into(binding.profileImage);

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

        final ArrayList<MessageModel> messageModels = new ArrayList<>();
        final ChatAdapter chatAdapter = new ChatAdapter(messageModels,this,recieveId);

        binding.chatRecyclerView.setAdapter(chatAdapter);

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

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



        binding.send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String message = binding.enterMessage.getText().toString();
                final MessageModel model = new MessageModel(senderId, message);
                model.setTimestamp(new Date().getTime());
                binding.enterMessage.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 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。
  • 我编辑了我的问题,请指教。
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。不要忘记添加数据库架构。
  • 请再次查看我的第二条评论。

标签: java android firebase firebase-realtime-database


【解决方案1】:

替换

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.receiverTime);

    }
}

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.receiverTime);

    }
    public void setData(MessageModel messageModel){
        viewHolder.receiverMsg.setText(messageModel.getMessage());
    }
}

替换

public class SenderViewHolder extends RecyclerView.ViewHolder{

    TextView senderMsg, senderTime;

    public SenderViewHolder(@NonNull View itemView) {
        super(itemView);

        senderMsg = itemView.findViewById(R.id.receiverText);
        senderTime = itemView.findViewById(R.id.senderTime);

    }
}

public class SenderViewHolder extends RecyclerView.ViewHolder{

    TextView senderMsg, senderTime;

    public SenderViewHolder(@NonNull View itemView) {
        super(itemView);

        senderMsg = itemView.findViewById(R.id.receiverText);
        senderTime = itemView.findViewById(R.id.senderTime);

    }
    public void setData(MessageModel messageModel){
        viewHolder.receiverMsg.setText(messageModel.getMessage());
    }
}

然后最后用

替换你的onBindViewHolder
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    MessageModel messageModel = messageModels.get(position);

    if (getItemViewType(position) == SENDER_VIEW_TYPE) ((SenderViewHolder) holder).setData(messageModel);
    else ((ReceiverViewHolder) holder).setData(messageModel);

}

我不确定它是否会有所帮助,但它肯定会优化您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多