这篇博客主要面向两类读者:1、遇到了IllegalArgumentException: Path must not be empty
这个报错信息。2、想要确定当在listview中加载不完整的image的时候,他们的app是否能够正常运行。我们将会在SimpleImageListAdapter
这个类中做我们的操作,代码如下:
public class SimpleImageListAdapter extends ArrayAdapter {
private Context context;
private LayoutInflater inflater;
private String[] imageUrls;
public SimpleImageListAdapter(Context context, String[] imageUrls) {
super(context, R.layout.listview_item_image, imageUrls);
this.context = context;
this.imageUrls = imageUrls;
inflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// changed, see next code blog
}
}
让我们来看一下getView()这个方法,首先,你传入的URL有可能是null,也有可能是空字符串。你可以使用TextUtils.isEmpty()
来检验。
Option 1:让ImageView为空
如果你让ImageView为空,你需要使用cancelRequest()
取消Picasso的请求。这会确保ImageView上没有正在进行的网络请求。这会在用户快速滑动ListView的时候或者ImageView重用的时候发生。这避免了在之前的ListView中加载不正确的图片。
再者,你可以重新设置ImageView。你不需要Picasso清空ImageView。你只需要调用imageView.setImageDrawable(null)
。然而,你需要确保这在你的UI中看起来不那么奇怪,因为你的ImageView仍然占有空间,即使它并没有显示图片。
Option 2:展示Placeholder
另一种情况是你可以使用placeholder这个方法而不是使用一个空ImageView。你可以根据你的情况来决定到底使用哪一种比较好。
如果你决定使用placeholder,你应该使用Picasso来完成。你可以使用常规的.load().into(imageView)
,Picasso将会加载placeholder。如果你确实使用了Picasso,你不需要在调用cancelRequest()
这个方法了,因为一旦一个加载图片的请求被响应,Picasso自动完成这些操作。
下面是示例代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
convertView = inflater.inflate(R.layout.listview_item_image, parent, false);
}
ImageView imageView = (ImageView) convertView;
if (TextUtils.isEmpty(imageUrls[position])) {
// option 1: cancel Picasso request and clear ImageView
Picasso
.with(context)
.cancelRequest(imageView);
imageView.setImageDrawable(null);
// option 2: load placeholder with Picasso
/*
Picasso
.with(context)
.load(R.drawable.floorplan)
.into(imageView);
*/
}
else {
Picasso
.with(context)
.load(imageUrls[position])
.fit() // will explain later
.into(imageView);
}
return convertView;
}