我有在ListView中使用AsyncTask加載圖像的奇怪問題。在我的ListView中,每行都包含一個ImageView和一個TextView。我跟着這個鏈接吧:點擊列表項時,圖像在列表視圖中交換它們的行
http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html
的圖像正在從URL成功下載並填寫他們的尊重行。但是當我滾動ListView或點擊任何列表項時,圖像只是交換它們的行。儘管TextView中的文本保留在相同的行上。我不明白爲什麼會發生。我已經搜索了很多,但找不到它的完美理由。請幫忙。
這裏是我的適配器類:
private class ListAdapter extends BaseAdapter{
private ArrayList<HashMap<String, Object>> allFriends;
private LayoutInflater mInflater;
public ListAdapter(ArrayList<HashMap<String, Object>> allFriends, Context context){
this.allFriends = allFriends;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return allFriends.size();
}
@Override
public Object getItem(int position) {
return allFriends.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
FriendsViewHolder holder;
if (convertView == null||!(convertView instanceof TextView)||!(convertView instanceof ImageView)) {
convertView = mInflater.inflate(R.layout.friend_list_view, null);
holder = new FriendsViewHolder();
holder.friendName = (TextView) convertView.findViewById(R.id.friendName);
holder.friendImage = (ImageView) convertView.findViewById(R.id.friendImage);
convertView.setTag(holder);
}else {
holder = (FriendsViewHolder) convertView.getTag();
}
holder.friendName.setText((String) allFriends.get(position).get(FriendsActivity.FRIENDS_NAME_KEY));
String otherId=(String) allFriends.get(position).get(FriendsActivity.IDKEY);
String isImage=(String) allFriends.get(position).get(FriendsActivity.IS_IMAGE_KEY);
if(isImage.equalsIgnoreCase("true")){
download(otherId, holder.friendImage);
}
return convertView;
}
}//End of list adapter
以及下載方法是:
public void download(String otherId, ImageView imageView) {
BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);
task.execute(otherId);
}
這裏BitmapDownloaderTask是異步任務下載圖片:
class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private String otherId;
private final WeakReference<ImageView> imageViewReference;
public BitmapDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
// Actual download method, run in the task thread
protected Bitmap doInBackground(String... params) {
// params comes from the execute() call: params[0] is the url.
return getOtherUserImage(params[0]);
}
@Override
// Once the image is downloaded, associates it to the imageView
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if(bitmap!=null){
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if(imageView != null){
imageView.setImageBitmap(bitmap);
}
}
}
}
}
而且getOtherUserImage方法是:
public Bitmap getOtherUserImage(String otherUserId){
// code to download the image goes here. It returns bitmap "bmImg".
if(bmImg==null){
return null;
}else {
bmImg = Bitmap.createScaledBitmap(bmImg,imageWidth, imageHeight, true);
/*availableFriends.get(position).put(BITMAP_KEY, bmImg);
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});*/
return bmImg;
}
}
你是否遵循查看持有者的方法?發佈您的自定義適配器,看看發生了什麼。 – 2012-07-20 12:53:04
是的,我遵循ViewHolder方法。請參閱編輯。 – 2012-07-20 13:04:50