Java BaseAdapter与毕加索问题
我在使用毕加索从服务器加载ListView中的图像时遇到问题 我有一个BaseAdapter,用于填充我的ListView。在此ListView中,有些项目有图像,有些项目没有 在这种方法中:Java BaseAdapter与毕加索问题,java,android,listview,baseadapter,picasso,Java,Android,Listview,Baseadapter,Picasso,我在使用毕加索从服务器加载ListView中的图像时遇到问题 我有一个BaseAdapter,用于填充我的ListView。在此ListView中,有些项目有图像,有些项目没有 在这种方法中: public View getView(final int position, View convertView, ViewGroup parent) { 我有: 这段代码可以工作,但我经常看到图像位于与其所属位置不同的位置 可以想象,这对用户来说是非常烦人的。。谢谢大家您遇到了这个问题,因为ListV
public View getView(final int position, View convertView, ViewGroup parent) {
我有:
这段代码可以工作,但我经常看到图像位于与其所属位置不同的位置强>
可以想象,这对用户来说是非常烦人的。。谢谢大家您遇到了这个问题,因为ListView回收项目视图+毕加索调用是异步的。。。它是如何出现的
holder.imageD.setImageBitmap(null)代码>
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调用中创建更少的内部对象。您还应该在else Station中使用毕加索调用。。。然后应该取消对holder.imageD的任何加载请求…@Selvin,所以我应该写:holder.imageD.setImageBitmap(null);如果(…){Picasso…}?你能给我举个例子吗?else{Picasso.with(context1).load(null).placeholder(R.drawable.white).into(holder.imageD);}
@Selvin write:else{holder.imageD.setImageBitmap(null);}不是一回事吗?不!你读过我的评论了吗?我认为最好是手动设置图像上的空值,然后通知毕加索取消请求Picasso.with(c).cancelRequest(holder.imageD);holder.imageD.setImageBitmap(空)代码>你的方式似乎在无缘无故地创建一个新请求。@Budius。。。你说的“新请求”是什么意思?(来自piccasso库的请求对象或某个网络请求?)事实上,它几乎与“into”中的代码相同:if(!data.hasImage()){picasso.cancelRequest(target);target.onPrepareLoad(setPlaceholder?getPlaceholderDrawable():null);return;}
如果uri为null,则hasImage返回false。。。因此,将不会使用网络操作(如果事实如此,将是syncrounus调用)。。。此外,在我的版本中,将使用占位符,而不是库中的null bitmapI表示新请求创建者
对象。从源代码行#293if(path==null){returnnewrequestcreator(this,null,0)
和私有void cancelExistingRequest(对象目标)
code-on-line#569只是取消了现有的一个。我知道它们很小,但想象一下,滚动数千个项目的列表以及GC必须运行以删除所有这些小对象。关于占位符:它也可以调用ImageView上的setImageResource(R…)
(来源:)好的…我已经在答案中添加了您的评论…仍然不知道占位符是否以某种方式被缓存…android framework是否正在缓存setImageResource
…如果答案是肯定和否定,那么第一个版本可能会更有效:)
{
Picasso.with(context1).cancelRequest(holder.imageD);
//holder.imageD.setImageBitmap(null); //or
holder.imageD.setImageResource(R.drawable.white); //depends on your needs
}