ListViewへの画像表示

これで数時間ハマった。

XMLを取得、データベースを更新した後、

// 全てのデータのカーソルを取得
Cursor c = mDb.query(TABLE, null, null, null, null, null, STATE_ID + " DESC");
        
// ベースクラスにカーソルのライフサイクルを管理させる
startManagingCursor(c);
	        
// データベースのカラムと、リストビューを関連付ける
String[] from = new String[]{NAME, TEXT, PROFILE_IMAGE_URL};
int[] to = new int[]{R.id.TextView_name, R.id.TextView_text, R.id.ImageView_icon};
mAdapter = new SimpleCursorAdapter(this, R.layout.friends_timeline_row, c, from, to); setListAdapter(mAdapter);

PROFILE_IMAGE_URLカラムにはプロフィール画像のURLが入ってて、R.id.ImageView_iconは画像を表示させるつもりのImageView。

こんな感じでListViewに表示させてるんだけど、画像URLをImageViewにAdaptするだけじゃ、当然画像は表示されない。そりゃそーだ。

いろいろ調べたりした結果、SimpleCursorAdapter.ViewBinderのインターフェースを実装、その中でImageViewに画像を与えることにした。

private class MyViewBinder implements SimpleCursorAdapter.ViewBinder{

	@Override
	public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
		try {
			switch(columnIndex)
			{
				case 1:
					break;
				case 2:
					URL imageUrl = new URL(cursor.getString(columnIndex));
					InputStream imageIs = imageUrl.openStream();
					Bitmap bm = BitmapFactory.decodeStream(imageIs);
					((ImageView)view).setImageBitmap(bm);
					break;
				case 3:
					((TextView)view).setText(cursor.getString(columnIndex));
					break;
				case 4:
					((TextView)view).setText(cursor.getString(columnIndex));
					break;
				default:
					break;
			}
			return true;
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}
}

case分岐が実数で見苦しいが、case2がPROFILE_IMAGE_URLカラム。setListAdapterの後に、

mAdapter.setViewBinder(new MyViewBinder());

とすることで、画像が表示されるようになりました!

case2,3はただのTextViewだからsetListAdapterの時点で表示されるんだけど、setViewBinderで設定しないでほっとくと、消えてしまう。だから2度手間なんだけど・・・なんかいい方法他にないんかな。

それと画像を表示すると、いままでスムーズだったスクロールが引っかかるようになった。Bitmapだからか?ローカルにjpg等で保存してから与えたほうがいいんだろうか。まあ、表示の度にイチイチURLから取得してBitmap生成して・・・なんてのはアレだから、そのうちそうするつもりだけど。

そのうち、というか次の課題にするか。そうなると直近の課題はデータファイル保存だな。