Skip to content

Instantly share code, notes, and snippets.

@shunsugai
Created July 29, 2012 09:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shunsugai/3196879 to your computer and use it in GitHub Desktop.
Save shunsugai/3196879 to your computer and use it in GitHub Desktop.
AndroidのListViewで非同期で画像を表示する
package com.sugaishun.sample;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.Locale;
import org.joda.time.DateTime;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
class MyAdapter extends BaseAdapter {
private Context context;
private List<Entry> entries;
MyAdapter(Context context, List<Entry> entries) {
this.context = context;
this.entries = entries;
}
@Override
public int getCount() {
return entries.size();
}
@Override
public Object getItem(int position) {
return entries.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Entry entry = (Entry) getItem(position);
View row = convertView;
if (row == null) {
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.row, parent, false);
}
ViewHolder holder = (ViewHolder) row.getTag();
if (holder == null) {
holder = new ViewHolder(row);
row.setTag(holder);
}
// 画像を表示するとこの処理
holder.icon.setImageDrawable(context.getResources().getDrawable(R.drawable.invisible));
holder.icon.setTag(entry.getLink());
// キャッシュに画像があればそれを表示。なければAsyncTaskで取ってくる。
Drawable image = ImageCache.get(entry.getLink());
if (image == null) {
FetchImageTask task = new FetchImageTask(holder.icon);
task.execute(entry.getLink());
} else {
holder.icon.setImageDrawable(image);
}
holder.dateTime.setText(getFormattedDateTime(entry.getTime()));
holder.title.setText(entry.getTitle());
holder.blogTitle.setText(entry.getBlog_title());
return row;
}
public String getFormattedDateTime(String ISO8601DateTime) {
DateTime dt = new DateTime(ISO8601DateTime);
return dt.toString("yyyy年MM月dd日 HH:mm", Locale.JAPAN);
}
class FetchImageTask extends AsyncTask<String, Void, Drawable> {
private ImageView imageView;
private String tag;
public FetchImageTask(ImageView imageView) {
this.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("http://favicon.qfor.info/w/" + urls[0]);
image = Drawable.createFromStream((InputStream) url.getContent(), "");
ImageCache.set(urls[0], image);
}
return image;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Drawable result) {
if (this.tag.equals(this.imageView.getTag())) {
if (result == null) return;
this.imageView.setImageDrawable(result);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment