Tuesday 15 April 2014

picasso - wrong images in listview because imageview is recycled -



picasso - wrong images in listview because imageview is recycled -

the code looks this:

@override public view getview(int position, view convertview, viewgroup parent) { final contact currcontact = getitem(position); final viewholder viewholder; if (convertview == null) { viewholder = new viewholder(); layoutinflater inflater = layoutinflater.from(getcontext()); convertview = inflater.inflate(r.layout.contact_item, parent, false); viewholder.profileiv = (imageview) convertview.findviewbyid(r.id.profileiv); viewholder.nametv = (textview) convertview.findviewbyid(r.id.nametv); convertview.settag(viewholder); } else { viewholder = (viewholder) convertview.gettag(); **************************per jake wharton's response****************************************** picasso.with(getcontext()).cancelrequest(viewholder.profileiv); } string currname = currcontact.getname(); /* 1 asynchronously gets https://ajax.googleapis.com/ajax/services/search/images? rsz=8&start=0&v=1.0&imgsz=medium&imgtype=linear&q=(currname) */ apiclient.getimagejson(getcontext(), currname, new jsonhttpresponsehandler() { @override public void onsuccess(int statuscode, header[] headers, jsonobject imgjson) { seek { jsonobject responsedatavalue = imgjson.getjsonobject("responsedata"); jsonarray resultsvalue = responsedatavalue.getjsonarray("results"); jsonobject result = resultsvalue.getjsonobject(0); string imgurl = result.getstring("url"); // 2 picasso.with(getcontext()).load(imgurl).into(viewholder.profileiv); } grab (exception e) { e.printstacktrace(); } } the asynchronous phone call launched, , user scrolls down. the phone call completes, image url obtained, , picasso makes request render image, in wrong imageview because of recycling

the way know around create first request(to obtain image link) synchronous, blocking ui create sure getview isn't called 1 time again before image loaded. there improve way around this? many in advance.

the reason seeing behavior calling picasso object after making asynchronous request. means picasso has no way of knowing view recycled new item.

the easiest way solve adding phone call picasso cancel existing requests recycled view.

picasso.with(getcontext()).cancelrequest(viewholder.profileiv)

this should done outside of apiclient.getimagejson phone call runs synchronously when adapter called.

android-listview picasso android-async-http

No comments:

Post a Comment