Java Android聊天在DataSnapshot.getValue()上崩溃
这是我的第一个Firebase应用程序,我正在尝试检索聊天信息列表。循环停止了,我不知道为什么以及如何修复它 错误: com.google.firebase.database.DatabaseException:无法转换对象 从java.lang.String类型到com.apps.amchat.Model.Chat类型 错误就在这里 Chat Chat=snapshot.getValue(Chat.class)Java Android聊天在DataSnapshot.getValue()上崩溃,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,这是我的第一个Firebase应用程序,我正在尝试检索聊天信息列表。循环停止了,我不知道为什么以及如何修复它 错误: com.google.firebase.database.DatabaseException:无法转换对象 从java.lang.String类型到com.apps.amchat.Model.Chat类型 错误就在这里 Chat Chat=snapshot.getValue(Chat.class) 误差函数 public void onDataChange(@NonNul
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 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;
}
}
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;
}
}
}
公共类MessageAdapter扩展了RecyclerView.Adapter{
公共静态最终int MSG_TYPE_LEFT=0;
公共静态最终int MSG_TYPE_RIGHT=1;
私有上下文;
私人名单mChat;
私有字符串imageurl;
FirebaseUser定影器;
public MessageAdapter(上下文mContext、列表mChat、字符串imageurl){
this.mChat=mChat;
this.mContext=mContext;
this.imageurl=imageurl;
}
@非空
@凌驾
public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
if(viewType==MSG\u TYPE\u RIGHT){
查看视图=LayoutFlater.from(mContext).充气(R.layout.chat\u item\u right,parent,false);
返回新的MessageAdapter.ViewHolder(视图);
}否则{
查看视图=LayoutFlater.from(mContext).充气(R.layout.chat\u item\u left,parent,false);
返回新的MessageAdapter.ViewHolder(视图);
}
}
@凌驾
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder,int位置){
Chat Chat=mChat.get(位置);
show_message.setText(chat.getMessage());
if(imageurl.equals(“默认”)){
holder.profile\u image.setImageResource(R.mipmap.ic\u启动器);
}否则{
使用(mContext).load(imageurl).into(holder.profile\u image);
}
}
@凌驾
public int getItemCount(){
返回mChat.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图显示消息;
公共图像查看剖面图;
公共视图持有者(视图项视图){
超级(项目视图);
show_message=itemView.findviewbyd(R.id.show_message);
profile\u image=itemView.findviewbyd(R.id.profile\u image);
}
}
@凌驾
public int getItemViewType(int位置){
fuser=FirebaseAuth.getInstance().getCurrentUser();
if(mChat.get(position.getSender().equals(fuser.getUid())){
返回消息类型右;
}否则{
返回消息类型左;
}
}
}
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) {
}
});
}
}
公共类MessageActivity扩展了AppCompatActivity{
圆形图像查看纵断面图;
文本视图用户名;
FirebaseUser定影器;
数据库参考;
图像按钮btn_发送;
编辑文本发送;
MessageAdapter消息适配器;
列出mchat;
回收视图回收视图;
意图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_消息);
//工具栏
Toolbar Toolbar=findviewbyd(R.id.Toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setTitle(“”);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
完成();
}
});
//回收者视图
recyclerView=findViewById(R.id.recycler\u视图);
recyclerView.setHasFixedSize(true);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getApplicationContext());
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);
profile_image=findviewbyd(R.id.profile_image);
username=findviewbyd(R.id.username);
btn_send=findviewbyd(R.id.btn_send);
text\u send=findviewbyd(R.id.text\u send);
intent=getIntent();
最终字符串userid=intent.getStringExtra(“userid”);
fuser=FirebaseAuth.getInstance().getCurrentUser();
btn_send.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串msg=text_send.getText().toString();
如果(!msg.equals(“”){
sendMessage(fuser.getUid(),userid,msg);
}否则{
Toast.makeText(MessageActivity.this,“您不能发送空消息”,Toast.LENGTH_SHORT.show();
}
text_send.setText(“”);
}
});
reference=FirebaseDatabase.getInstance().getReference(“用户”).child(用户ID);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
User=dataSnapshot.getValue(User.class);
username.setText(user.getUsername());
if(user.getImageURL().equals(“默认”)){
profile_image.setImageResource(R.mipmap.ic_启动器);
}否则{
Glide.with(MessageActivity.this).load(user.getImageURL())到(profile\u image)中;
}
readMessage(fuser.getUid(),userid,user.getImageURL());
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
私有void sendMessage(字符串发送方、字符串接收方、字符串消息){
DatabaseReference=FirebaseDatabase.getInstance().getReference();
HashMap HashMap=新的HashMap();
hashMap.put(“发送方”,发送方);
hashMap.put(“接收方”,接收方);
hashMap.put(“message”,message);
reference.child(“Chats”).push().setValue(hashMap);
}
专用void readMessage(最终版本)
FirebaseDatabase.getInstance().getReference().child("Chats").setValue(chatMessage);
FirebaseDatabase.getInstance().getReference().child("Chats").push().setValue(chatMessage);