如何在ListView中使用Picasso?

3

我想在ListView中添加有关小部件的信息:

public class Widget {
    String w_type;
    String title;
    String desc;
    String img;
//....
}

我希望在列表视图中显示图片,但只有当img字段不为空时才显示。我应该如何使用Picasso来实现,在滚动后不重复显示错误的图像?以下是我为listview适配器的getView方法的当前代码:
public View getView(int i, View someView, ViewGroup arg2) {
    LayoutInflater inflater = LayoutInflater.from(context);
    if (someView == null) {
        someView = inflater.inflate(R.layout.widgets_list, arg2, false);
    }

    ImageView img = (ImageView) someView.findViewById(R.id.pic);

    String img_url = data.get(i).img;
    if (!img_url.equals("")){ 
        Picasso.with(context).load(img_url).into(img);
    }
    return someView;
}

但现在ListView显示错误并重复显示图片。我该如何解决?


getView()方法中实现ViewHolder。详情请访问:https://dev59.com/bX7aa4cB1Zd3GeqPu8w4 - Harshad Pansuriya
1个回答

1
我建议使用ViewHolder模式。更多信息可以在这里找到:

https://developer.android.com/training/improving-layouts/smooth-scrolling.html

请注意,您必须处理img_url为空的情况,并为该情况设置默认图像。否则,当该单元格被回收时,图像将保持不变,然后您将遇到所说的重复问题。
以下是示例代码:
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {

  ViewHolder holder;

  if (convertView == null) {
    convertView = LayoutInflater.from(mContext).inflate(R.layout.widgets_list, null);
    holder = new ViewHolder();
    holder.mImageView = (ImageView) convertView.findViewById(R.id.iconImageView);
    convertView.setTag(holder);
  } else {
    holder = (ViewHolder) convertView.getTag();
  }

  //fetching your data object with the current position
  Example example = mExamples[position];

  String img_url = example.get(i).img;

  if (!img_url.equals("")){
    Picasso.with(context).load(img_url).into(holder.mImageView);
  } else {
    //todo - implement a default image in case img_url is indeed empty
    Picasso.with(context).load(defaultImage).into(holder.mImageView);
  }

  return convertView;
}

private static class ViewHolder {
  ImageView mImageView;
}

太棒了!我一直在寻找这样的东西。谢谢! - Erez Hod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接