表題の件ですが、内容は以下の通りです。
[やりたいこと]
インターネットから、データを取得して、ListViewに一覧表示する
その際に、画像だけは非同期処理で表示するようにする
[問題点]
画像が本来表示されるセルではなく、別のセルに表示されてしまう
原因は、ListViewがインスタンスを使いまわしていることだと思いますが、
解決方法がわからず困っています。
お分かりの方がいれば、ご教授をお願いいたします。
以下、ソースになります。
■MainActivity.java
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setListAdapter(new ListViewRowAdapter(this, R.layout.list_view_row));
ListViewDownloadTask listViewTask = new ListViewDownloadTask();
listViewTask.execute("Test");
}
private class ListViewDownloadTask extends AsyncTask<String, Void, List> {
private static final String TAG = "ListViewDownloadTask";
@Override
protected void onPreExecute() {
setProgressBarIndeterminateVisibility(true);
}
@Override
protected List doInBackground(String... args) {
// データ取得処理
return search(args[0]);
}
@Override
protected void onPostExecute(List result) {
for(Iterator it = result.iterator(); it.hasNext();) {
Bean bean = (Bean)it.next();
ListViewRowAdapter adapter = (ListViewRowAdapter)getListAdapter();
adapter.add(bean);
}
setProgressBarIndeterminateVisibility(false);
}
}
}
■ListViewRowAdapter.java
public class ListViewRowAdapter extends ArrayAdapter<Bean> {
private LayoutInflater inflater;
public ListViewRowAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
inflater = (LayoutInflater)super.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
v = inflater.inflate(R.layout.list_view_row, null);
}
Bean bean = super.getItem(position);
// title
TextView titleText =
(TextView)v.findViewById(R.id.listViewRow_textView_title);
titleText.setText(bean.title);
ImageView imageView =
(ImageView)v.findViewById(R.id.listViewRow_imageView_image)
DownloadTask task = new DownloadTask(bean.url);
task.execute(imageView);
return v;
}
}
■DownloadTask.java
public class DownloadTask extends AsyncTask<ImageView, Void, Bitmap> {
private ImageView imageView;
private String url;
public DownloadTask(String _url) {
super();
url = _url;
}
@Override
protected Bitmap doInBackground(ImageView... _imageView) {
this.imageView = _imageView[0];
Bitmap image = ImageCache.getImage(url);
if (image == null) {
image = HttpClient.getImage(url);
ImageCache.putImage(url, image);
}
return image;
}
@Override
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}
}