ListViewでの画像表示(非同期)に関して

120 views
Skip to first unread message

akio yamazaki

unread,
Apr 11, 2010, 4:45:24 AM4/11/10
to android-g...@googlegroups.com
山崎と申します。初めてメールさせていただきます。

表題の件ですが、内容は以下の通りです。

[やりたいこと]
インターネットから、データを取得して、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);
}
}

Reply all
Reply to author
Forward
0 new messages