Expected a List while deserializing, but got a class java.util.HashMap Firebase Android

0

I'm surprised to have this failure because it happens to me just initialize the app and it never happened to me. The fault can be something of the json? I leave the code where the fault occurs

public void datos() {

    navMenuName.setText( user.getDisplayName() );
    navMenuEmail.setText( user.getEmail() );

    if (user.getPhotoUrl() != null) {
        Glide.with( this ).load( user.getPhotoUrl() ).into( navMenuImage );
    }

    email = navMenuEmail.getText().toString();
    names = navMenuName.getText().toString();
    uiD = user.getUid();

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

    database.getReference().child( USERS_NODE ).child( uiD ).addListenerForSingleValueEvent( new ValueEventListener() {
        @Override
        public void onDataChange( DataSnapshot dataSnapshot) {
            users = dataSnapshot.getValue( User.class );    // FALLO

            if (users == null) {
                users = new User( names, email, photoUrl );

                databaseReference.child( USERS_NODE ).child( uiD ).setValue( users );
            }

            Glide.with( context ).load( users.getAvatar() ).into( navMenuImage );
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    } );
}

Logcat

com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap
    at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source:106)
    at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source:0)
    at com.google.android.gms.internal.firebase_database.zzku.zza(Unknown Source:125)
    at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source:196)
    at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source:0)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
    at com.lujan.confirmaciones.MainActivity$1.onDataChange(MainActivity.java:267)
    at com.google.firebase.database.zzp.onDataChange(Unknown Source:7)
    at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source:13)
    at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source:2)
    at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source:71)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)

User Class

public class User {


private String name;
private String email;
private String avatar;
private List<String> events;
private String vote;


//Constructor


public User() {
    this.events = new ArrayList<>();
}

public User(List<String> events) {
    this.events = events;
}

public User(String name, String email, String avatar) {

    this.name = name;
    this.email = email;
    this.avatar = avatar;
    this.events = new ArrayList<>();
}

public User(String name, String email, String avatar, List<String> events) {

    this.name = name;
    this.email = email;
    this.avatar = avatar;
    this.events = events;

}

public User(String name, String email, String avatar, String vote) {

    this.name = name;
    this.email = email;
    this.avatar = avatar;
    this.events = new ArrayList<>();
    this.vote = vote;

}
public void setName(String name) {
    this.name = name;
}

public void setEmail(String email) {
    this.email = email;
}

public void setAvatar(String avatar) {
    this.avatar = avatar;
}

public void setEvents(List<String> events) {
    this.events = events;
}

public void setVote() {
    this.vote = vote;
}

//  GET´S


public String getName() {
    return name;
}

public String getEmail() {
    return email;
}

public String getAvatar() {
    return avatar;
}

public List<String> getevents() {
    return events;
}

public String getvote() {
    return vote;
}

}

    
asked by lujan 05.08.2018 в 17:21
source

2 answers

0

To bring the list of events from your firebase you can do the following

this onDataChange comes from the reference child("Events").addValueEventListener(...

public void onDataChange(DataSnapshot dataSnapshot) {
    List<User> list = new ArrayList<User>();
    for (DataSnapshot child: dataSnapshot.getChildren()) {
        list.add(child.getValue(User.class));
    }
}

To bring data from firebase with a bean in this case User.class you do not need to have declared constructors with data, a simple empty constructor would be fine

public User() {

}
    
answered by 05.08.2018 в 20:39
0

The problem that you are having is with the attribute List<String> events , for how this firebase is configured maps all the collections as Maps, to which a key: value structure assigns them. To solve this problem you have the following alternatives:

  • Use Map<String,String> for events
  • (Not tested) Iterate in the events setter about the values of the map that is received and save them in the list by hand.
  • Example:

      public void setEvents(Map<String,String> mapa){
        this.events = new LinkedList();
        for(String valor: mapa.values()){
        this.events.add(valor);
        }
    
        
    answered by 06.08.2018 в 21:42