1

Meine App funktioniert gut, außer dass ich sah, dass einige Elemente beim Scrollen Bilder änderten, irgendwie weiß ich, dass das ein Recycling-Problem ist, aber ich weiß nicht, wie man es löst. Ich habe einige Code-Modifikationen in meinem Adapter versucht, weil ich denke, dass es von dort ist, aber ich war nicht erfolgreich.Warum ändert sich mein Artikelbild in benutzerdefinierter RecyclerView beim Scrollen?

Für das Download Bild, benutze ich Picasso, danke für die Hilfe!

EDIT: FULL ADAPTER

private Product currentProduit; 
private ImageView myImageView; 
private Context context; 
private List<Product> productList; 
private String getAgencyName, getImgUrl; 
private List<String> getUrlList_Thumb; 
private List<String> getUrlList_Full; 
private ImageButton favorite_img_btn; 
private boolean star_isClicked; 


public CustomAdapter_VersionR(Context ctx, List<Product> products) { 
    this.context = ctx; 
    this.productList = products; 
} 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    private TextView title, descrip, price, agency, country, city, type, nbRoom; 
    public MyViewHolder(View view) { 
     super(view); 
     //references to layout 
     title = (TextView) view.findViewById(R.id.title_product); 
     descrip = (TextView) view.findViewById(R.id.descrip_product); 
     price = (TextView) view.findViewById(R.id.price_product); 
     myImageView = (ImageView) view.findViewById(R.id.img_product); 
     agency = (TextView) view.findViewById(R.id.agency_product); 
     country = (TextView) view.findViewById(R.id.country_product); 
     city = (TextView) view.findViewById(R.id.city_product); 
     type = (TextView) view.findViewById(R.id.type_product); 
     nbRoom = (TextView) view.findViewById(R.id.nbRoom_product); 
    } 
} 


@Override 
public CustomAdapter_VersionR.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_list_row, parent, false); 
    Log.i("INFO", "Creation ok"); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(CustomAdapter_VersionR.MyViewHolder holder, int position) { 
    //get current product of the list 
    currentProduit = productList.get(position); 

    try { 
     getImgUrl = currentProduit.getUrlImageList_thumb().get(0); 
     Picasso.with(context).load(getImgUrl).fit().into(myImageView); 
     Log.i("INFO", "Image loaded"); 
    } catch (Exception e) { 
     myImageView.setImageResource(R.drawable.no_image); 
     Log.e("ERROR", "No image or image error"); 
     e.printStackTrace(); 
    } 

    holder.agency.setText(currentProduit.getNomAgence(); 
    holder.descrip.setText(currentProduit.getDescription()); 
    holder.title.setText(currentProduit.getTitre()); 
    holder.price.setText(currentProduit.getPrix()); 
    holder.nbRoom.setText(currentProduit.getNbPieces()); 
    holder.country.setText(currentProduit.getPays()); 
    holder.city.setText(currentProduit.getVille()); 
    holder.type.setText(currentProduit.getType_produit()); 
} 

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

EDIT: Nach einigen Untersuchungen, da ist etwas in meinem onBindViewHolder hinzuzufügen, aber der Platzhalter nicht funktioniert, ich könnte mit ihm soemthing falsch machen ..

+0

Geben Sie den vollständigen Code für den Adapter ein. Anscheinend verwenden Sie ViewHolder nicht. – drulabs

+0

@drulabs, geschrieben vollständigen Code :) – Jay

Antwort

1

Dies liegt daran, dass die recycelte Ansicht die Informationen des vorherigen Artikels enthält. Sie müssen myImageView ein Platzhalterbild zur Verfügung stellen.

Betrachten Platzhalter Bild wie unter Einstellung:

myImageView.setImageResource(R.drawable.no_image); 
try { 
    // current try block 
} catch { 
    // current catch block 
} 

oder Platzhalter Bild über Picasso bietet:

Picasso.with(context) 
    .load(getImgUrl) 
    .placeholder(R.drawable.user_placeholder) 
    .fit() 
    .into(imageView); 
+0

Wo gebe ich den Picasso Platzhalter? In meinem Versuch Block? oder kurz vor @crowjdh – Jay

+0

empfehle ich vor try block (früherer code block) weil da die chance besteht, das platzhalterbild nicht zu setzen, wenn in try block etwas schief geht. Außerdem frage ich mich, warum Sie myImageView als Membervariable haben, nicht im Ansichtshalter. In diesem Fall wird myImageView geändert, wenn Sie die neue Zelle auffüllen (onBindViewHolder wird aufgerufen). @Jay –

+0

Ich habe das versucht: getImgUrl = null; Picasso.with (Kontext) .load (getImgUrl) .placeholder (R.drawable.no_image) .fit(). In (myImageView); Ich habe es vor Versuch, catch Block, nicht funktioniert. Du hast Recht, ich werde wieder mit ImageView in Viewholder testen. – Jay

0

Statt versuchen und zu fangen geben, wenn und sonst

 if (yourList.profileImage != null) { 
    Picasso.with(context).load(list.getProfilePicture()).into(holder.profilePictureImageView); 
     } 
     else { 
    Picasso.with(context).load(R.drawable.profile_image).into(holder.profilePictureImageView); 
     } 
2

Überschreiben Sie diese beiden Methoden in Ihrem RecyclerView-Adapter. Dies löst dein Problem.

@Override 
    public long getItemId(int position) { 
     return position; 
    } 

@Override 
    public int getItemViewType(int position) { 
     return position; 
    } 
Verwandte Themen