Table of Contents
1にしか画像ファイルはないんだけど・・・・
下にスクロールすると6にも7にも・・・
原因は、 ListView 内で contentview を使いまわしてるから、
非同期で取ってくると参照がずれる。
Adapter.getView()
- @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;
- }
DownloadTask
- 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);
- }
- }
- }
- }