0

firebase内にいくつかの特定のアクションで変更されたデータがあり、その変更がアプリケーションに表示されます。addChildEventListenerのonChildChanged()でデータが更新される代わりに、リストにデータが追加されています

RecyclerView私はfirebaseからのすべてのデータが入力されています。

ここでは、コードです:ここではUHandlerAdapter.java

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) { 

      } 
     }); 

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

問題はそれが値を変更しています反映していないリストで、完全な他の項目を追加変更されることを​​でviewsです以前に追加されたアイテムで更新されましたonChildAdded()

以前に追加したアイテム自体でそれを更新するにはどうすればよいですか?

+0

まず、' 'map.get(オブジェクトをキー) 'は型セーフではありません。間違った型のキーを与えると、コンパイラは不平を言っていません。詳細については、https://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-notfully-genericを参照してください。 – alan7678

+0

@ alan7678大丈夫です。それを指摘してくれてありがとう。質問された質問にも答えてください。 –

+0

'UHandler'があなたのビューモデルであると仮定すると、新しいアイテムを望まない場合は' new'を使うべきではありません。だから単に 'new'を使わないで' list.add'を使わないで 'list.get'を使ってあなたのオブジェクトを取り出して更新してください。 – alan7678

答えて

1

あなたは例えば、それを更新するためにkeysを保存することができます:あなたは `ArrayListの IMAGEURL = map2.get( "IMAGEURL")のバグがあるすべての

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

これはうまくいった! 14時間後に賞金を授与されます(StackOverflowのメッセージに従って)。 –

+0

あなたもこれを手伝ってもらえますか:https://stackoverflow.com/q/46638945/6144372 ": –

+0

@HammadNasirどのようにそのライブラリが動作するかわかりません、ごめんなさい。 – Ibrahim

関連する問題