Here is a code-snippet. I may not compile, but i think you'll get the idea :-)
[code] ExecutorService EXECUTOR = Executors.newFixedThreadPool(3); // max 3 worker threads. ... public View getView(final AbsListView listView, View convertView, int pos, long id) { ... ... final String imgUrl = ... ... final ImageView imgView = ... ... Bitmap bm = mBitmapCache.get(imgUrl); if (bm != null) imgView.setImageBitmap(bm); else { imgView.setTag(imgUrl); FutureTask<?> task = EXECUTOR.submit(new Runnable() { public void run() { final Bitmap newBM = getImageFrom(imgUrl); // you have to write this method if (newBM == null) return; // be sure that mBitmapCache is thread-safe. mBitmapCache.put(imgUrl, newBM); // instead of 'listView', you could use a new Handler instance. listView.post(new Runnable() { public void run() { String checkUrl = (String)imgView.getTag(); if (checkUrl != null && !checkUrl.equals(imgUrl)) return; imgView.setImageBitmap(newBM); } }); } private Bitmap getImageFrom(String url) { // download the data from imgUrl. // create a bitmap from it. return bitMap; } }); } // if you want, you can hold on to 'task' and call 'cancel' on it if necessary, e.g. // when this convertView is about to be re-used and to be assigned to a different image. return convertView; } [/code] On Mar 24, 10:13 am, Streets Of Boston <flyingdutc...@gmail.com> wrote: > I've done the same in my apps for ListView (whether they be in > ListActivity or in a plain Activity) with good success. > > I use the java.util.concurrent's ExecutorService to obtain images: > > 1. Your getView(..) (or bindView/newView/etc) needs to assign an image/ > thumbnail (bitmap) to an ImageView. But you don't have the bitmap yet. > If you do have it (store in a limited size cache), just set it . > 2. If not, obtain a FutureTask from the ExecutorService and this > FutureTask then will download the image, create a thumbnail from it > and creates a Bitmap from this thumbnail. Remember the id of the image > (can be an id, Uri, URL, whatever, as long as it is unique) and assign > it to the ImageView (setTag()). > 3. When ready, the FutureTask will 'post' back to the main-thread that > it has an new thumbnail. > 4. On the 'post'-back, loop through the children of ListView, get the > appropriate ImageView, the one whose tag (getTag()) is equal to the > one that FutureTask you got the image for, assign the Bitmap to this > ImageView. This is it. > > For myself I created a sub-system of ExecutorService and FutureTask, > called 'Cancelable' tasks, which make it easier to cancel queued up > tasks when they're no longer necessary. But this is an optimization. > > On Mar 24, 8:06 am, Mark Murphy <mmur...@commonsware.com> wrote: > > > > > Ivan Soto wrote: > > > Do you have any article/tutorial about the placeholder images to share? > > > I'm trying to find one with no luck. > > > I have used the technique, but not in code I'm allowed to share. I do > > need to more formally write this up at some point, but I do not have > > anything immediately handy. > > > The gist of it is that you create your adapter and set it up, in > > getView() or newView()/bindView() (depending on adapter choice), to see > > if the thumbnail has been downloaded. If so, use it for the list row > > being inflated/updated; if not, leave the ImageView in the row pointing > > to some placeholder Drawable resource. This means as the user scrolls, > > she will pick up the thumbnails. Also, at the end, you can quickly > > iterate over the rows (ListView is a ViewGroup, IIRC, so there are > > methods to iterate its children) and ensure each of those rows' > > ImageViews are using their associated thumbnails. > > > -- > > Mark Murphy (a Commons Guy)http://commonsware.com > > Android App Developer Books:http://commonsware.com/books.html- Hide quoted > > text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---