BaseAdapter 和 Picasso 问题
BaseAdapter and Picasso issue
我在使用 Picasso 从服务器加载 ListView 中的图像时遇到问题。
我有一个用于填充我的 ListView 的 BaseAdapter。在此 ListView 中,有些项目有图像,有些没有。
在这个方法中:
public View getView(final int position, View convertView, ViewGroup parent) {
我愿意:
...
//context = Activity context;
//context1 = Context context1;
context1 = context.getApplicationContext();
if (!photo[position].equals("")) {
String stringurl = "http://www.blablabla.it/img/"+photo[position]+".jpg";
Picasso.with(context1)
.load(stringurl)
.placeholder(R.drawable.white)
.into(holder.imageD);
}
else {
holder.imageD.setImageBitmap(null);
}
此代码有效,但我经常看到图像位于与其所属位置不同的位置!
你可以想象这对用户来说非常烦人..谢谢大家
您遇到过这个问题,因为 ListView 回收项目视图 + Picasso 调用是异步的...它怎么会出现?
- 你开始加载毕加索
- 视图被重用(convertView != null)
- 您正在设置
holder.imageD.setImageBitmap(null);
- 从第 1 点开始的异步已完成
这就是为什么您加载了错误的图像...
为避免此类行为,您需要通知 Picasso 加载器取消之前的请求。
因此,只需将图像位图设置为 null,您就必须通过 Picasso 库进行设置(在 else 语句中使用):
Picasso.with(context1).load(null).placeholder(R.drawable.white).into(holder.imageD);
编辑: 在@Budius 评论之后:更好的解决方案将取消并设置为:
{
Picasso.with(context1).cancelRequest(holder.imageD);
//holder.imageD.setImageBitmap(null); //or
holder.imageD.setImageResource(R.drawable.white); //depends on your needs
}
这应该是更有效的方法,因为它应该在每次 getView 调用时创建更少的内部对象。
我在使用 Picasso 从服务器加载 ListView 中的图像时遇到问题。
我有一个用于填充我的 ListView 的 BaseAdapter。在此 ListView 中,有些项目有图像,有些没有。
在这个方法中:
public View getView(final int position, View convertView, ViewGroup parent) {
我愿意:
...
//context = Activity context;
//context1 = Context context1;
context1 = context.getApplicationContext();
if (!photo[position].equals("")) {
String stringurl = "http://www.blablabla.it/img/"+photo[position]+".jpg";
Picasso.with(context1)
.load(stringurl)
.placeholder(R.drawable.white)
.into(holder.imageD);
}
else {
holder.imageD.setImageBitmap(null);
}
此代码有效,但我经常看到图像位于与其所属位置不同的位置!
你可以想象这对用户来说非常烦人..谢谢大家
您遇到过这个问题,因为 ListView 回收项目视图 + Picasso 调用是异步的...它怎么会出现?
- 你开始加载毕加索
- 视图被重用(convertView != null)
- 您正在设置
holder.imageD.setImageBitmap(null);
- 从第 1 点开始的异步已完成
这就是为什么您加载了错误的图像...
为避免此类行为,您需要通知 Picasso 加载器取消之前的请求。 因此,只需将图像位图设置为 null,您就必须通过 Picasso 库进行设置(在 else 语句中使用):
Picasso.with(context1).load(null).placeholder(R.drawable.white).into(holder.imageD);
编辑: 在@Budius 评论之后:更好的解决方案将取消并设置为:
{
Picasso.with(context1).cancelRequest(holder.imageD);
//holder.imageD.setImageBitmap(null); //or
holder.imageD.setImageResource(R.drawable.white); //depends on your needs
}
这应该是更有效的方法,因为它应该在每次 getView 调用时创建更少的内部对象。