AndroidのListViewでWebの画像を表示させる
ListView内にTwiterアイコンを表示させたら、かなり重くなりました。調べてみると、AdapterのgetViewが毎回呼ばれていて、毎回画像をとりに行っていました。
コンストラクタで画像は取得して使いまわすようにしました。コンストラクタ内に例外処理があるのはなんとなくなので、もう少し改良しようと思います。
package jp.co.acl_inc.android.netladio; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.ArrayList; import android.content.Context; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class TwitterAdapter extends ArrayAdapter { private ArrayList<TwitterStatus> items; private LayoutInflater inflater; Drawable[] icons; /** * コンストラクタ * @param context * @param textViewResourceId * @param items */ public TwitterAdapter(Context context, int textViewResourceId, ArrayList<TwitterStatus> items) { super(context, textViewResourceId, items); this.items = items; //コンストラクタで画像データをセットする icons = new Drawable[items.size()]; for (int i = 0; i < items.size(); i++) { TwitterStatus item = (TwitterStatus) items.get(i); try { URL url = new URL(item.getProfileImageUrl()); icons[i] = Drawable.createFromStream((InputStream)url.getContent(), ""); } catch (MalformedURLException e) { Log.e("--ACL--", e.getMessage()); } catch (IOException e) { Log.e("--ACL--", e.getMessage()); } } this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { // ビューを受け取る View view = convertView; if (view == null) { // 受け取ったビューがnullなら新しくビューを生成 view = inflater.inflate(R.layout.tlist_row, null); } // 表示すべきデータの取得 TwitterStatus item = (TwitterStatus)items.get(position); if (item != null) { //ユーザー名 TextView fromUserTextView = (TextView)view.findViewById(R.id.from_user); fromUserTextView.setText(item.getFromUser()); //テキスト TextView textTextView = (TextView)view.findViewById(R.id.text); textTextView.setText(item.getText()); //画像 ImageView profileImageView = (ImageView)view.findViewById(R.id.prifile_image_url); if (icons != null) profileImageView.setImageDrawable(icons[position]); //発信時刻 TextView createAtTextView = (TextView)view.findViewById(R.id.create_at); createAtTextView.setText(item.getCreateAt().toLocaleString()); } return view; } }