I trying a hand at ListViews and my current experiment is aimed at
displaying some data in a ListView. The data to be displayed in each
row is simple: an image and some text. The images come from a remote
server and the textual data is hardcoded.

I have a class that downloads images using AsyncTask and caches the
list of images fetched as SoftReferences in a LinkedHashMap. I am also
passing a reference of the view to this class, so when the image
download/cache read is complete the class will set appropriate Bitmap
in the view.

Following is my code:

//class BasicAdapter extends ArrayAdapter<RowData>
...
static class ViewHolder{
                TextView text;
                ImageView icon;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
{
                ViewHolder holder;
                if(convertView == null){
                        convertView = 
mInflater.inflate(R.layout.listview_row,null);

                        holder = new ViewHolder();
                        holder.text = (TextView) 
convertView.findViewById(R.id.row_txt);
                        holder.icon = (ImageView) 
convertView.findViewById(R.id.row_img);

                        convertView.setTag(holder);
                }
                else{
                        holder = (ViewHolder) convertView.getTag();
                }

                holder.text.setText(mDataSet.get(position).getMText());

                //set default icon
                holder.icon.setImageResource(R.drawable.icon);

                // set the actual image from the cache
                String imageUrl = mDataSet.get(position).getMUrl();
                WriteThroughCache.getImage(holder.icon, imageUrl);

                return convertView;

        }

// My helper class that manages cache and image Download

public class WriteThroughCache{
        static LinkedHashMap<String,SoftReference<Bitmap>> imageCache =
                new LinkedHashMap<String,SoftReference<Bitmap>>();

        public static void getImage(ImageView icon, String imageUrl){
                if(imageCache.containsKey(imageUrl)){
                        Bitmap image = imageCache.get(imageUrl).get();
                        if(image != null){
                                icon.setImageBitmap(image);
                                return;
                        }
                }

                new LoadImageInBackground().execute(new 
Object[]{icon,imageUrl});

        }

        static class LoadImageInBackground extends AsyncTask<Object, Void,
Bitmap>{
                ImageView mIcon = null;
                String mUrl = null;
                @Override
                protected Bitmap doInBackground(Object... params) {
                        mIcon = (ImageView)params[0];
                        mUrl = (String) params[1];
                        Bitmap image = BitmapFactory.decodeStream
(GetMethodExecutor.getResponseStream(mUrl));
                        return image;
                }
                @Override
                protected void onPostExecute(Bitmap result) {
                        super.onPostExecute(result);
                        mIcon.setImageBitmap(result);
                        imageCache.put(mUrl, new SoftReference<Bitmap>(result));
                }


        }
}

Problem: The applications seems to work just fine. However, when I
touch scroll the screen sometimes, the rows display the default image
and "Loading.." text. These are never refreshed.
But if I fling the listview, everything works normal then.

I am not sure of what I am missing here, please guide.

Thanks.



-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to