【问题标题】:Android ListView bug on first item using picasso使用毕加索的第一个项目上的 Android ListView 错误
【发布时间】:2017-04-02 09:50:24
【问题描述】:

我有一个加载篮球队比赛的 ListView 适配器。如果是应用程序所针对的团队,我将使用毕加索或资源加载我的图像。在我的第一个项目上,它似乎从网络加载了两个团队的图像。这是一个示例代码和图像。

    @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;
}

查看第一个标记为红色的项目:

【问题讨论】:

  • 你有什么问题。请解释更多。
  • 第一个标记为红色的元素两侧不应有相同的图像。如果我向下和向上滚动,它会正确地回收视图。
  • 您是否在代码中实现了 ViewHolder?

标签: android listview adapter picasso


【解决方案1】:

我注意到你的代码有问题

 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

【讨论】:

  • 我会试一试,会回复你的。
  • 我需要做一个Holder Class吗?
  • 是的。保留 ViewHolder 是一种最佳做法。它将重用已经膨胀的视图。无需再次膨胀相同的布局。
【解决方案2】:

你可以像这样实现 ViewHolder,

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

【讨论】:

  • 问题仍然存在,滚动似乎扼杀了思想,你忘记了 view.setTag(holder);一旦添加它就像一个魅力。
【解决方案3】:

找到了解决办法,好像需要补充一下

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;

}

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2013-06-24
    • 1970-01-01
    • 2014-05-31
    • 2017-06-30
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多