2012年11月5日月曜日

ListView に非同期で取ってきた画像を表示したら位置がずれるの対応

たぶん原因としては、 ListView 内で contentview を使いまわしてるから、
非同期で取ってくると参照がずれて違うところに当てはめちゃうっていうことだと思う。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ListItem listItem = (ListItem) getItem(position);
ViewHolder holder;

if (convertView == null) {
convertView = layoutInflater.inflate(resourceId, null);

holder = new ViewHolder();
holder.thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.explain = (TextView) convertView.findViewById(R.id.explain);
holder.nextButton = (ImageView) convertView.findViewById(R.id.nextButton);
convertView.setTag(holder);

} else {
holder = (ViewHolder) convertView.getTag();
}
// 画像を非表示
holder.thumbnail.setVisibility(View.GONE);
// ImageView にタグを設定
// このタグを AsyncTask で使います。
holder.thumbnail.setTag(listItem.thumbnailUrl);
// 非同期通信開始
DownloadTask task = new DownloadTask(holder.thumbnail);
task.execute(listItem.thumbnailUrl);
// テキストは普通にセットする
holder.title.setText(listItem.title);
holder.explain.setText(listItem.explain);


return convertView;

}



class DownloadTask extends AsyncTask<String, Drawable, Void> {
private ImageView imageView;
private String tag;

public DownloadTask(ImageView imageView) {
this.imageView = imageView;
// ImageView に設定したタグをメンバへ
this.tag = imageView.getTag().toString();
}

@Override
protected Drawable doInBackground(String... urls) {
synchronized (context) {
try {
Drawable image = ImageCache.get(urls[0]);
if (image == null) {
URL url = new URL(urls[0]);
image = Drawable.createFromStream((InputStream) url.getContent(), "");
ImageCache.set(urls[0], image);
}
return image;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;

}
}

@Override
protected void onPostExecute(Drawable result) {
// メンバのタグと imageView にセットしたタグが一致すれば
// 画像をセットする
if (this.tag.equals(this.imageView.getTag())) {
if (result != null) {
this.imageView.setImageDrawable(result);
this.imageView.setVisibility(View.VISIBLE);
}
}
}
}

0 件のコメント:

コメントを投稿