0

J'ai des données dans firebase qui sont modifiées sur certaines actions spécifiques et je veux que ces changements soient affichés dans l'application.Les données sont ajoutées dans la liste au lieu d'être mises à jour dans addChildEventListener onChildChanged()

J'ai un RecyclerView dans lequel toutes les données de Firebase sont remplies.

Code est ici:

databaseReference.child("uListings").child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       // recyclerview gets populated here 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       if (dataSnapshot.getValue() != null) { 
        Map<String,String> map = (Map<String,String>)dataSnapshot.getValue(); 
        Map<ArrayList<String>,ArrayList<String>> map2 = (Map<ArrayList<String>,ArrayList<String>>)dataSnapshot.getValue(); 
        String pDescription = map.get("pDescription"); 
        String pDuration = map.get("pDuration"); 
        String pPrice = map.get("pPrice"); 
        String postedAt = map.get("postedAt"); 
        String views = map.get("views"); 
        ArrayList<String> imageUrl = map2.get("imageUrl"); 

          if (imageUrl != null) { 
           UHandler pHandler = new UHandler(imageUrl.get(0), pDescription, pDuration, pPrice, postedAt, views); 
           list.add(pHandler); 
           adapter.notifyDataSetChanged(); 
           progressBar.setVisibility(View.INVISIBLE); 
          } else { 
           Toast.makeText(getBaseContext(), "imageUrlNone", Toast.LENGTH_SHORT).show(); 
          } 

       } else { 
        Log.d("PDPchange", "NULL"); 
        progressBar.setVisibility(View.INVISIBLE); 
       } 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

est ici UHandlerAdapter.java:

public class UHandlerAdapter extends RecyclerView.Adapter<UHandlerAdapter.MyViewHolder> { 

    private Context mContext; 
    private List<UHandler> listingList; 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     public TextView pDescription, pDuration, pPrice, postedAt, listingViews, imageUrl; 
     public ArrayList<String> imageUrls; 
     public CircleImageView pImage; 


     public MyViewHolder(View view) { 
      super(view); 
      pImage = (CircleImageView) view.findViewById(R.id.p_image_profile); 
      pDescription = (TextView) view.findViewById(R.id.p_description_profile); 
      pDuration = (TextView) view.findViewById(R.id.p_duration_profile); 
      pPrice = (TextView) view.findViewById(R.id.p_price_profile); 
      postedAt = (TextView) view.findViewById(R.id.p_posted_when_profile); 
      listingViews = (TextView) view.findViewById(R.id.listing_views_profile); 
      imageUrl = (TextView) view.findViewById(R.id.image_urls_profile); 
     } 
    } 


    public UHandlerAdapter(Context mContext, List<UProfileHandler> listingList) { 
     this.mContext = mContext; 
     this.listingList = listingList; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.profile_all, parent, false); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, int position) { 
     UHandler handler = listingList.get(position); 
     holder.pDescription.setText(handler.getPDescriptionProfile()); 
     holder.pDuration.setText(handler.getPDurationProfile()); 
     holder.pPrice.setText(handler.getPPriceProfile()); 
     holder.postedAt.setText(handler.getPostedAt()); 
     holder.listingViews.setText(handler.getListingViews()); 

     // loading album cover using Glide library 
     Glide.with(mContext) 
       .load(handler.getPImageProfile()) 
       .apply(new RequestOptions().placeholder(R.drawable.ic_placeholder).error(R.drawable.ic_error)) 
       .into(holder.pImage); 

    } 

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

Le problème est que dans onChildChanged() le views qui obtient changé ajouter un autre élément complet dans la liste qui reflète sa valeur a changé et pas seulement est mis à jour dans les éléments ajoutés précédemment dans onChildAdded().

Comment puis-je simplement le mettre à jour dans les éléments ajoutés précédemment?

+0

d'abord tout ce que vous avez un bug avec 'ArrayList imageUrl = map2.get ("imageUrl"),' 'map.get (Object key) 'n'est pas sûr de type ie. le compilateur ne se plaindra pas si vous donnez une clé du mauvais type. Voir https://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic pour plus d'informations. – alan7678

+0

@ alan7678 okay. Merci de l'avoir signalé. Veuillez également répondre à la question posée. –

+0

En supposant que 'UHandler' est votre modèle de vue, vous ne devriez pas utiliser' new' si vous ne voulez pas un nouvel élément. Donc, pour le mettre simplement n'utilisez pas 'new' n'utilisez pas' list.add', utilisez 'list.get' pour récupérer votre objet et le mettre à jour. – alan7678

Répondre

1

Vous pouvez stocker keys afin de le mettre à jour par exemple:

ArrayList<String> mKeys = new ArrayList<String>(); 

databaseReference.child("uListings").child(AccessToken.getCurrentAccessToken().getUserId()).addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
         // recyclerview gets populated here 

         String key = dataSnapshot.getKey(); 
         mKeys.add(key); 
         adapter.notifyDataSetChanged(); 

        } 

        @Override 
        public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
         if (dataSnapshot.getValue() != null) { 
          ....... 
          //now we get the index to update specific value 
           String key = dataSnapshot.getKey(); 
           int index = mKeys.indexOf(key); 
           list.set(index, pHandler); 

           adapter.notifyDataSetChanged(); 
           .... 
        } 
+0

Cela a fonctionné! Accordera la prime après 14 heures (comme invité par StackOverflow). –

+0

pouvez-vous aider avec celui-ci aussi: https://stackoverflow.com/q/46638945/6144372 ": | –

+0

@HammadNasir Je n'ai aucune idée comment fonctionne cette bibliothèque, désolé – Ibrahim