A.Butakidis
A.Butakidis

Reputation: 385

Android ListView bug on first item using picasso

Ι have a ListView adapter that loads basketball team games. I'm loading my images with picasso or resources if it's the team that the app is for. On my first item it seems to load both teams's images from the web. Here is a sample code and image.

    @Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view = convertView;

    if (convertView == null) {
        view = LayoutInflater.from(context).inflate(layoutResource, parent, false);
    }

    Match programItem = getItem(position);     
    ImageView ourTeamLogo = (ImageView) view.findViewById(R.id.program_item_our_team_logo);      
    ImageView foeLogo = (ImageView) view.findViewById(R.id.program_item_foe_logo);

    if (programItem.isHome()) {

        ourTeamLogo.setImageResource(R.drawable.our_team_logo);

        Picasso.with(context).
                cancelRequest(foeLogo);
        Picasso.with(getContext())
                .load(programItem.getFoeLogoURL())
                .fit().placeholder(R.drawable.placeholder_team).into(foeLogo);        
    }
    else {

        foeLogo.setImageResource(R.drawable.our_team_logo);

        Picasso.with(context).
                cancelRequest(ourTeamLogo);
        Picasso.with(getContext())
                .load(programItem.getFoeLogoURL())
                .fit().placeholder(R.drawable.placeholder_team).into(ourTeamLogo);
    }

    return view;
}

See first item marked in red:

enter image description here

Upvotes: 0

Views: 158

Answers (3)

Ajith Pandian
Ajith Pandian

Reputation: 1342

You can implement ViewHolder like this,

static class ViewHolder {
    ImageView ourTeamLogo, foeLogo;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    final ViewHolder holder;
    if (convertView == null) {
        view = LayoutInflater.from(context).inflate(layoutResource, parent, false);
        holder = new ViewHolder();
        holder.ourTeamLogo = (ImageView) view.findViewById(R.id.program_item_our_team_logo);
        holder.foeLogo = (ImageView) view.findViewById(R.id.program_item_foe_logo);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    Match programItem = getItem(position);

    if (programItem.isHome()) {

        holder.ourTeamLogo.setImageResource(R.drawable.our_team_logo);

        Picasso.with(getContext())
                .load(programItem.getFoeLogoURL())
                .fit().placeholder(R.drawable.placeholder_team).into(holder.foeLogo);
    } else {

        holder.foeLogo.setImageResource(R.drawable.our_team_logo);

        Picasso.with(getContext())
                .load(programItem.getFoeLogoURL())
                .fit().placeholder(R.drawable.placeholder_team).into(holder.ourTeamLogo);
    }

    return view;
}

Upvotes: 1

A.Butakidis
A.Butakidis

Reputation: 385

Found the solution, seems like I needed to add

Picasso.with(context).cancelRequest(holder.ourTeamLogo); Picasso.with(context).cancelRequest(holder.foeTeamLogo);

    static class ViewHolder {
ImageView ourTeamLogo, foeLogo;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    final ViewHolder holder;
    if (convertView == null) {
    view = LayoutInflater.from(context).inflate(layoutResource, parent, false);
    holder = new ViewHolder();
    holder.ourTeamLogo = (ImageView) view.findViewById(R.id.program_item_our_team_logo);
    holder.foeLogo = (ImageView) view.findViewById(R.id.program_item_foe_logo);
} else {
    holder = (ViewHolder) convertView.getTag();
}

Match programItem = getItem(position);

if (programItem.isHome()) {

    holder.ourTeamLogo.setImageResource(R.drawable.our_team_logo);

    Picasso.with(context).
                cancelRequest(holder.ourTeamLogo);
    Picasso.with(getContext())
            .load(programItem.getFoeLogoURL())
            .fit().placeholder(R.drawable.placeholder_team).into(holder.foeLogo);
} else {

    holder.foeLogo.setImageResource(R.drawable.our_team_logo);
    Picasso.with(context).
                cancelRequest(holder.ourTeamLogo);
    Picasso.with(getContext())
            .load(programItem.getFoeLogoURL())
            .fit().placeholder(R.drawable.placeholder_team).into(holder.ourTeamLogo);
}

return view;

}

Upvotes: 0

rookieDeveloper
rookieDeveloper

Reputation: 2468

things I noticed that were wrong in your code

 Holder holder=null;
if(view==null)
{
    view = LayoutInflater.from(context).inflate(layoutResource, parent, false);
    holder = new Holder(view, position);
    view.setTag(holder);
}
else{
     holder=(Holder)view.getTag();
    }
//Continue your code here

Upvotes: 1

Related Questions