Partage
  • Partager sur Facebook
  • Partager sur Twitter

Failed to convert value of type java.util.HashMap

Erreur lors de la recuperations des informations de l'utilisateur

    27 octobre 2019 à 3:59:59

    Bonjour/bonsoir a tous, j'espère que vous allez bien. Depuis peu j'ai un souci avec Firebase, je vais essayer d'etre le plus claire possible.

    Au lancement de l'application, on atteri sur le fils d'actualite, on voit bel et bien les publications mais en descendant dans le fils d'actualite et que mon utilisateur actuellement connecter recontre sa propre publication, j'obtiens cette erreur de la part de la base de donnees de Firebase

     com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertString(com.google.firebase:firebase-database@@19.1.0:408)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.1.0:199)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(com.google.firebase:firebase-database@@19.1.0:178)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$100(com.google.firebase:firebase-database@@19.1.0:47)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.1.0:575)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.1.0:545)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.1.0:415)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.1.0:214)
    at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.1.0:79)
    at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.1.0:203)
    at com.ackerman.ubi.Adapter.PostAdapter$6.onDataChange(PostAdapter.java:254)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.1.0:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.1.0:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.1.0:55)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7237)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.intern

    Clairement qu'il narrive pas a convertir les valeurs de mon Hashmap en String, le probleme est que avant que ne puisse apporter des modifications au niveau de l'interface de l'application, le meme code servant a recuperer les informations du publieur fonctionnais correctement (dont je n'ai pas apporter de modification)

    Le code de l'adapter permettant d'afficher les posts et de recuperer les infos sur le publieur :

    package com.ackerman.ubi.Adapter;

    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.PopupMenu;
    import android.widget.TextView;
    import android.widget.Toast;

    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;

    import com.ackerman.ubi.ChatActivity;
    import com.ackerman.ubi.Model.PostModel;
    import com.ackerman.ubi.Model.UserModel;
    import com.ackerman.ubi.R;
    import com.ackerman.ubi.ShowSearchedUserActivity;
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.request.RequestOptions;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.auth.FirebaseUser;
    import com.google.firebase.database.DataSnapshot;
    import com.google.firebase.database.DatabaseError;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    import com.google.firebase.database.ValueEventListener;

    import java.util.List;
    import java.util.Objects;

    public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> {

    private Context mContext;
    private List<PostModel> mPostModel;

    private FirebaseUser firebaseUser;

    public PostAdapter(Context mContext, List<PostModel> mPostModel) {
    this.mContext = mContext;
    this.mPostModel = mPostModel;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.item_post, parent, false);
    return new PostAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    final PostModel postModel = mPostModel.get(position);

    Glide.with(mContext).load(postModel.getPostimage())
    .apply(new RequestOptions()
    .placeholder(R.drawable.image_loader))
    .into(holder.post_image);

    holder.description.setText(postModel.getDescription());

    holder.price.setText(String.format("%s FCFA", postModel.getPrice()));
    holder.price.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_price_tag_post, 0, 0, 0);

    holder.location.setText(postModel.getLocation());
    holder.location.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_placeholder_post, 0, 0, 0);

    holder.product_state.setText(postModel.getProduct_state());

    holder.username.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Intent intent = new Intent(mContext, ShowSearchedUserActivity.class);
    intent.putExtra("profileid", postModel.getPublisher());
    mContext.startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
    }
    });

    holder.more.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    showPopup(view);
    }
    });

    productState(holder, postModel);

    sendMessage(holder, postModel);

    getPublisherInfo(holder.image_profile, holder.username, postModel.getPublisher(), mContext);


    }

    @Override
    public int getItemCount() {
    return mPostModel.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

    ImageView image_profile, post_image;
    TextView description, username, price, location, product_state;
    ImageButton more;

    ViewHolder(@NonNull View itemView) {
    super(itemView);

    image_profile = itemView.findViewById(R.id.image_profile);
    post_image = itemView.findViewById(R.id.post_image);
    description = itemView.findViewById(R.id.description);
    username = itemView.findViewById(R.id.username);
    price = itemView.findViewById(R.id.price);
    location = itemView.findViewById(R.id.location);
    more = itemView.findViewById(R.id.more);
    product_state = itemView.findViewById(R.id.product_state);

    }
    }

    /**
    * Methode pour verifier si le le post est déjà sauvegarder les favoris de l'utilisateur ou non
    * prenon en parametre l'ID du post ainsi que l'item du memu Popup ( voir menu popup case item_save)
    *
    * @param postid
    * @param menuItem
    */
    private void isSaved(final String postid, final MenuItem menuItem) {
    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    DatabaseReference reference = FirebaseDatabase.getInstance()
    .getReference()
    .child("Saves")
    .child(Objects.requireNonNull(firebaseUser).getUid());

    reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    if (dataSnapshot.child(postid).exists()) {
    menuItem.setIcon(R.drawable.ic_bookmark_1);
    menuItem.setTitle("Détaché");
    } else {
    menuItem.setIcon(R.drawable.ic_bookmark_border);
    menuItem.setTitle("Eplinglé");
    }
    }

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

    }
    });
    }

    /**
    * Affichage du popup
    *
    * @param view
    */
    private void showPopup(View view) {
    final PopupMenu popupMenu = new PopupMenu(mContext, view);
    final PostModel postModel = new PostModel();
    popupMenu.inflate(R.menu.menu_post_item);
    popupMenu.show();

    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
    case R.id.item_delete:
    Toast.makeText(mContext, "Menu pour supprimer.... OK", Toast.LENGTH_SHORT).show();
    return true;
    case R.id.item_save:
    //Si l'ID l'utilisateur connecter est != de celui du post, afficher cet Item
    if (firebaseUser.getUid().equals(postModel.getPublisher())) {
    menuItem.setVisible(false);
    } else {
    menuItem.setVisible(true);
    }

    /*

    Verification si le titre de l'item lors du clique
    Si = à "Epinglé" on ajoute la valeur
    Sinon on retire la valeur

    */
    if (menuItem.getTitle().equals("Eplinglé")) {
    FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid()).child(postModel.getPostid()).setValue(true);
    } else {
    FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid()).child(postModel.getPostid()).removeValue();
    }
    isSaved(postModel.getPostid(), menuItem);
    return true;

    case R.id.item_share:
    Toast.makeText(mContext, "Menu pour partagez.... OK", Toast.LENGTH_SHORT).show();
    return true;

    default:
    return false;
    }
    }
    });
    }

    /**
    * Methode permattant de verfier l'etat du produit
    *
    * @param holder
    */
    private void productState(@NonNull ViewHolder holder, PostModel postModel) {
    if (postModel.getProduct_state().equals("Neuf")) {
    holder.product_state.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_box_new_post, 0, 0, 0);
    } else {
    holder.product_state.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_box_used_post, 0, 0, 0);
    }
    }

    /**
    * Methode permettant de commencer une conversation avec le publisher (sur le clique de l'image)
    *
    * @param holder
    * @param postModel
    */
    private void sendMessage(@NonNull ViewHolder holder, final PostModel postModel) {
    holder.post_image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    if (!postModel.getPublisher().equals(firebaseUser.getUid())) {
    Intent intent = new Intent(mContext, ChatActivity.class);
    intent.putExtra("profileid", postModel.getPublisher());
    mContext.startActivity(intent);
    } else {
    Log.d("User is same", "L'utilisateur est identique");
    }
    }
    });
    }

    private void getPublisherInfo(final ImageView image_profile, final TextView username, String userid, final Context context) {
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);

    reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    UserModel userModel = dataSnapshot.getValue(UserModel.class);
    Glide.with(context).load(userModel.getImageurl()).into(image_profile);
    username.setText(userModel.getUsername());
    }

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

    }
    });

    }
    }

    P.S : Le probleme se produit uniquement lorsque l'utilisateur recontre sa propre publication ou qu'il va sur son propre profil

    (Desole pour les accents)

    • Partager sur Facebook
    • Partager sur Twitter

    Delucis

    Failed to convert value of type java.util.HashMap

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown