Ошибка DatabaseException: Can't convert object of type java.lang.String to type com.example.yaryk.skymessage.Model.Chat

173
15 сентября 2019, 11:30

Помогите решить проблему com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.yaryk.skymessage.Model.Chat

и E/RecyclerView: No adapter attached; skipping layout - но эта вроде не критичная

public class MessageActivity extends AppCompatActivity {

CircleImageView ivProfileImage;
TextView tvUsername;
ImageButton btnSend;
EditText text_send;
MessageAdapter messageAdapter;
List<Chat> mchat;
FirebaseUser fuser;
DatabaseReference reference;
RecyclerView recycler_view;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_message);
    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 = findViewById(R.id.recycler_view);
    recycler_view.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
    linearLayoutManager.setStackFromEnd(true);
    recycler_view.setLayoutManager(linearLayoutManager);
    ivProfileImage = findViewById(R.id.ivProfileImage);
    tvUsername = findViewById(R.id.tvUsername);
    btnSend = findViewById(R.id.btnSend);
    text_send = findViewById(R.id.text_send);
    intent = getIntent();
    final String userid = intent.getStringExtra("userid");
    fuser = FirebaseAuth.getInstance().getCurrentUser();
    btnSend.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 sand 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);
            tvUsername.setText(user.getUsername());
            if(user.getImageURL().equals("default")){
                ivProfileImage.setImageResource(R.mipmap.ic_launcher);
            }else{
                Glide.with(MessageActivity.this).load(user.getImageURL()).into(ivProfileImage);
            }
            readMessage(fuser.getUid(), userid, user.getImageURL());
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
}
public 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);
                recycler_view.setAdapter(messageAdapter);
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
}

}

public class MessageAdapter extends RecyclerView.Adapter{

private static final int MSG_TYPE_LEFT = 0;
private 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.showMessage.setText(chat.getMessage());
    if(imageurl.equals("default")){
        holder.ivProfileImage.setImageResource(R.mipmap.ic_launcher);
    }else{
        Glide.with(mContext).load(imageurl).into(holder.ivProfileImage);
    }
}

@Override
public int getItemCount() {
    return mChat.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
    public TextView showMessage;
    public ImageView ivProfileImage;
    public ViewHolder(View itemView) {
        super(itemView);
        showMessage = itemView.findViewById(R.id.showMessage);
        ivProfileImage = itemView.findViewById(R.id.ivProfileImage);
    }
}
@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;
    }
}

}

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

}

READ ALSO
Установка JAVA EE

Установка JAVA EE

Подскажите чтобы поставить jAVA EE надо иметь уже SDK JAVA SE?

161
equals() и hashCode() в Java

equals() и hashCode() в Java

Если мы переопределяем equals(), то обязаны переопределить hasCode()Причем в обоих методах желательно использовать одни и те же поля класса

158
Почему BroadcastReceiver не принимает сообщения?

Почему BroadcastReceiver не принимает сообщения?

Имеется часть кода, в которой создается интент:

110
Как аннотации (к примеру, @Retention) могут аннотировать сами себя?

Как аннотации (к примеру, @Retention) могут аннотировать сами себя?

Тут видно, что аннотация @Retention стоит собственно над объявлением самой аннотации @RetentionИ такой трюк можно делать не только с мета-аннотациями,...

125