たぶん原因としては、 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 件のコメント:
コメントを投稿