I am trying to retrieve data from the Firebase Realtime Database and I want to display them on the screen in a TextView, but I'm facing whit this error:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.chocolate.ModelChatlist
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
at com.example.chocolate.ChatListFragment$1.onDataChange(ChatListFragment.java:67)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8010)
at java.lang.reflect.Method.invoke(Native Method)
The code of ChatListFragment class is given below:
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SearchView;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class ChatListFragment extends Fragment {
FirebaseAuth firebaseAuth;
RecyclerView recyclerView;
List<ModelChatlist> chatlistList;
List<ModelUser> userList;
DatabaseReference reference;
FirebaseUser currentUser;
AdapterChatlist adapterChatlist;
public ChatListFragment(){
//required empty
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chat_list, container, false);
firebaseAuth = FirebaseAuth.getInstance();
currentUser = FirebaseAuth.getInstance().getCurrentUser();
recyclerView = view.findViewById(R.id.recyclerView);
chatlistList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(currentUser.getUid());
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
chatlistList.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelChatlist chatlist = ds.getValue(ModelChatlist.class);
chatlistList.add(chatlist);
}
loadChats();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
private void loadChats() {
userList = new ArrayList<>();
reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
userList.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelUser user = ds.getValue(ModelUser.class);
for (ModelChatlist chatlist: chatlistList){
if (user.getUid() != null && user.getUid().equals(chatlist.getId())) {
userList.add(user);
break;
}
}
adapterChatlist = new AdapterChatlist(getContext(), userList);
recyclerView.setAdapter(adapterChatlist);
for (int i=0; i<userList.size(); i++ ) {
lastMessage(userList.get(i).getUid());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void lastMessage(String userId) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chats");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String theLastMessage = "default";
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelChat chat = ds.getValue(ModelChat.class);
if (chat==null) {
continue;
}
String sender = chat.getSender();
String receiver = chat.getReceiver();
if (sender == null || receiver == null) {
continue;
}
if (chat.getReceiver().equals(currentUser.getUid()) &&
chat.getSender().equals(userId) ||
chat.getReceiver().equals(userId) &&
chat.getSender().equals(currentUser.getUid())){
theLastMessage = chat.getMessage();
}
}
adapterChatlist.setLastMessageMap(userId, theLastMessage);
adapterChatlist.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void checkUserStatus(){
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
}
else {
startActivity(new Intent(getActivity(), MainActivity.class));
getActivity().finish();
}
}
}
The code for ModelChatList is given below:
package com.example.chocolate;
public class ModelChatlist {
String id;
public ModelChatlist(String id) {
this.id = id;
}
public ModelChatlist() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
database Database
I am trying to display the value of this child node in the Firebase but I am unable to do so because of this error.
ds.getValue(ModelChatlist.class)around line 67. Here you're trying to assign aStringto aModelChatlistvariable. You may want to create aModelChatlistobject, by a parametrized constructor (i.e.ModelChatlist(String s))ds.getValuedoes provide theidvalue, correct?com.example.chocolate.ModelChatlist'?