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生成して・・・なんてのはアレだから、そのうちそうするつもりだけど。
そのうち、というか次の課題にするか。そうなると直近の課題はデータファイル保存だな。