com.google.firebase.database.DatabaseException: невозможно преобразовать объект типа java.lang.String в тип com.example.yaryk.skymessage.Model.Chat - PullRequest
0 голосов
/ 01 февраля 2019

com.google.firebase.database.DatabaseException: невозможно преобразовать объект типа java.lang.String в тип ...

и еще одна ошибка. Адаптер не подключен;Пропуск макета - Но, похоже, это не критическая ошибка ///// Пожалуйста, помогите, я новичок в программировании, и этот проект очень важен для меня./////

Моя MessageActivity

public class MessageActivity extends AppCompatActivity {

CircleImageView ivProfileImage;
TextView tvUsername;

ImageButton btnSend;
EditText text_send;

MessageAdapter messageAdapter;
List<Chat> mChat;

FirebaseUser firebaseUser;
DatabaseReference databaseReference;

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");
    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

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


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

    databaseReference.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(firebaseUser.getUid(), userid, user.getImageURL());
        }

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

        }
    });

}

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

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

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

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

private void readMessage(final String myid, final String userid, final String imageurl){
    mChat = new ArrayList<>();

    databaseReference = FirebaseDatabase.getInstance().getReference("Chats");
    databaseReference.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) {

        }
    });

}

}

Мой MessageAdapter

открытый класс MessageAdapter расширяет RecyclerView.Adapter {

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

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) {
    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    if(mChat.get(position).getSender().equals(firebaseUser.getUid())){
        return MSG_TYPE_RiGHT;
    }else {
        return MSG_TYPE_LEFT;
    }
}

}

моя модель

пакет com.example.yaryk.skymessage.Model;

общедоступный класс чата {

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

}

структура базы данных

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

При использовании следующей строки кода:

databaseReference.child("Chats").push().setValue(hashMap);

Метод DatabaseReference push () метод:

Создает ссылку на автоматически сгенерированный дочерний элементlocation.

Это означает, что вы создаете новый объект Chat с автоматически сгенерированным ключом в узле Chats, который в вашей схеме должен выглядеть следующим образом:

Firebase-root
  |
  --- Chats
       |
       --- pushedId
             |
             --- message: "fggfg"
             |
             --- receiver: "0AQZ ... FK02"
             |
             --- sender: "CqjS ... QqE3"

Но, к сожалению, это не , как это выглядит в вашей базе данных.Смотрите, под узлом Chats, нет выдвинутого идентификатора, ваши свойства существуют непосредственно под узлом Chats.

enter image description here

Чтобы решить эту проблему, пожалуйста,удалите те три свойства, которые существуют в узле Chats и добавьте Chat объекты, используя следующие строки кода:

Chat chat = new Chat(sender, receiver, message);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference chatsRef = rootRef.child("Chats");
String key = chatsRef.child("Chats").push().getKey();
chatsRef.child(key).setValue(chat);

И ваша проблема будет решена.

0 голосов
/ 01 февраля 2019

Вы пытаетесь преобразовать текст строки в тип чата.

Используйте это - String chat = snapshot.getValue(String.class);

вместо Chat chat = snapshot.getValue(Chat.class);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...