gpt4 book ai didi

java - Android 聊天在 DataSnapshot.getValue() 上崩溃

转载 作者:行者123 更新时间:2023-12-02 10:26:46 34 4
gpt4 key购买 nike

这是我的第一个 Firebase 应用,我正在尝试检索聊天消息列表。循环停止,我不知道为什么以及如何修复它

错误:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.venomapps.amchat.Model.Chat

错误在这里

Chat chat = snapshot.getValue(Chat.class);

  1. 误差函数

        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    mchat.clear();
    for (DataSnapshot snapshot : dataSnapshot.getChildren()){
    Chat chat = snapshot.getValue(Chat.class);
    if(chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
    chat.getReceiver().equals(userid) && chat.getSender().equals(myid)){
    mchat.add(chat);
    }

    messageAdapter = new MessageAdapter(MessageActivity.this, mchat, imageurl);
    recyclerView.setAdapter(messageAdapter);

    }

    }
  2. 聊天类

    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;
    }

    public void setMessage(String message) {
    this.message = message;
    }
    }
  3. 适配器

    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;
    private String imageurl;

    FirebaseUser fuser;

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

    @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());

    if(imageurl.equals("default")){
    holder.profile_image.setImageResource(R.mipmap.ic_launcher);
    } else {
    Glide.with(mContext).load(imageurl).into(holder.profile_image);
    }

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

    public TextView show_message;
    public ImageView profile_image;

    public ViewHolder(View itemView){
    super(itemView);

    show_message = itemView.findViewById(R.id.show_message);
    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;
    }
    }
    }

编辑:因为我无法确定问题出在哪里

Structure Image

整个消息 Activity

导入 de.hdodenhof.circleimageview.CircleImageView;

public class MessageActivity extends AppCompatActivity {

CircleImageView profile_image;
TextView username;

FirebaseUser fuser;
DatabaseReference reference;

ImageButton btn_send;
EditText text_send;

MessageAdapter messageAdapter;
List<Chat> mchat;

RecyclerView recyclerView;

Intent intent;



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


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


// Recycler View
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);



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

intent = getIntent();
final String userid = intent.getStringExtra("userid");
fuser = FirebaseAuth.getInstance().getCurrentUser();



btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = text_send.getText().toString();
if(!msg.equals("")){
sendMessage(fuser.getUid(), userid, msg);
} else {
Toast.makeText(MessageActivity.this, "You can't send empty message", Toast.LENGTH_SHORT).show();
}
text_send.setText("");
}
});


reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);

reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
username.setText(user.getUsername());
if(user.getImageURL().equals("default")){
profile_image.setImageResource(R.mipmap.ic_launcher);
} else {
Glide.with(MessageActivity.this).load(user.getImageURL()).into(profile_image);
}

readMessage(fuser.getUid(), userid, user.getImageURL());
}

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

}
});
}

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

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

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

reference.child("Chats").push().setValue(hashMap);
}

private void readMessage(final String myid, final String userid, final String imageurl){
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);
if(chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
chat.getReceiver().equals(userid) && chat.getSender().equals(myid)){
mchat.add(chat);
}

messageAdapter = new MessageAdapter(MessageActivity.this, mchat, imageurl);
recyclerView.setAdapter(messageAdapter);

}

} */




public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mchat.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
Chat chat = snapshot.getValue(Chat.class);
if(chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
chat.getReceiver().equals(userid) && chat.getSender().equals(myid)){
mchat.add(chat);
}

messageAdapter = new MessageAdapter(MessageActivity.this, mchat, imageurl);
recyclerView.setAdapter(messageAdapter);

}

}








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

}
});
}
}

最佳答案

好消息,这很容易解决。

问题是您没有正确推送下图中的聊天数据。您只有 1 条聊天消息,而不是包含多个聊天的路径。

Original data structure

解决方案

你的数据库应该是这样的

Corrected data structure

突出显示的黄色键称为 push ids or push keys .

您很可能会像这样保存聊天数据:

FirebaseDatabase.getInstance().getReference().child("Chats").setValue(chatMessage);

您可以通过在 setValue 调用之前添加 push() 来实现您想要的目的。

FirebaseDatabase.getInstance().getReference().child("Chats").push().setValue(chatMessage);

关于java - Android 聊天在 DataSnapshot.getValue() 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53892586/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com