I'm using Parse in my app, and in order to load my 'profile' images, I need to retrieve a so called Parsefile. When the Parsefile is downloaded it uses a callback to notify when it's done. Now this is generally a nice way to do things but I encountered a problem with this when using a Listview and downloading the images with an Asynctask.
The problem is as follows:
In my ListView adapter in the getView method, I create an AsyncTask and execute it, this AsyncTask starts the retrieveProfileImage(callBack) function. In my callback I simply start a Runnable on the UI thread to update the ImageView in the View with the new (retrieved Image). The problem however as it seems, is the fact that as soon as I start my AsyncTask, the View is returned. So I can't set the other images to the correct row. I hope my code demonstrates my problem more clearly.
The ListAdapter:
public class FriendListAdapter extends ArrayAdapter<Profile> {
private int resource;
private Context context;
private List<Profile> friends;
private Profile fProfile;
private Bitmap profileImageBitmap;
private ProgressBar friendImageProgressBar;
//ui
private ImageView friendImage;
public FriendListAdapter(Context context, int resource,
        List<Profile> objects) {
    super(context, resource, objects);
    this.context = context;
    this.resource = resource;
    this.friends = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView  friendName = null;
    friendImage = null;
    View rowView = convertView;
    if (rowView == null) {
      LayoutInflater inflater = ((Activity) context).getLayoutInflater();
      rowView = inflater.inflate(R.layout.friendslist_row, null);
      friendName = (TextView) rowView.findViewById(R.id.fName);
      friendImage = (ImageView) rowView
          .findViewById(R.id.fImage);
      friendImageProgressBar = (ProgressBar) rowView.findViewById(R.id.friendImageProgressBar);
    } else {
        friendName = (TextView) convertView.findViewById(R.id.fName);
        friendImage = (ImageView) convertView.findViewById(R.id.fImage);
        friendImageProgressBar = (ProgressBar) convertView.findViewById(R.id.friendImageProgressBar);
    }
    fProfile = friends.get(position);
    DownloadProfileImage dImg = new DownloadProfileImage();
    dImg.execute();
    friendName.setText(fProfile.getName());
    return rowView;
}
private class DownloadProfileImage extends AsyncTask<Void, Integer, String> {
    @Override
    protected String doInBackground(Void... arg0) {
        Log.d("logpp", "Starting download image for " + fProfile.getName());
        fProfile.retrieveProfileImage(new ProfileImageCallback());
        return null;
    }
}
private class ProfileImageCallback extends GetDataCallback {
    @Override
    public void done(byte[] bytearray, ParseException e) {
        if (e == null) {
            Log.d("logpp", "Done downloading image for " + fProfile.getName() + ". Setting bitmap to:" +
         " " + friendImage.getId());
            profileImageBitmap = BitmapManager
                    .getBitmapFromByteArray(bytearray);
            ((Activity) context).runOnUiThread(new UpdateUi());
        }
    }
}
private class UpdateUi implements Runnable {
    @Override
    public void run() {
        friendImage.setImageBitmap(profileImageBitmap);
        friendImage.setVisibility(View.VISIBLE);
        friendImageProgressBar.setVisibility(View.INVISIBLE);
    }
}
}
The retrieveProfileImage method:
public void retrieveProfileImage(GetDataCallback callBack) {
    this.image.getDataInBackground(callBack);
}
I hope someone can help me with this one.
Regards,
Tim
 
     
    