画像と文字列の一覧表を表示する
画像と文字列を含むViewを一覧にして表示する方法は、次に説明しました。
android.R.drawableのアイコンを一覧表示する
android.R.drawableに含まれる全ての画像を一覧表示させる
これらの方法は、画像の全てがresource IDとして取り扱える場合に使用できます。
SimpleAdapterは、デフォルトでは、resource IDの画像を取り扱えるのです。
しかし、事情により、画像が、resource IDとして取り扱うことができず、Drawableである場合、SimpleAdapterの振る舞いを修正しなければなりません。
この修正には、SimpleAdapter.ViewBinderを使います。
sample codeを下記のとおり掲載しておきます。共有により起動可能なアプリの一覧を、アプリの名称とアイコンを対にして表示します。
この例では、Drawable型の画像とresource IDによる画像を一覧表の中に混在させて表示します。
学習・実験を目的とするため、冗長に書いてあります。
参考:
共有を事前に登録する
2011年11月14日 アイコンが重複して表示されるバグを修正しました。
Resources r;
Intent it;
PackageManager pm;
String sFrom[] = {"Image", "String"};
int iTo[] = new int[] {R.id.Image, R.id.TextAppName};
final List<Map<String, Object>> data;
Map<String, Object> m;
SimpleAdapter sa;
SimpleAdapter.ViewBinder savb;
savb = new SimpleAdapter.ViewBinder(){
@Override
public boolean setViewValue(View view, Object data, String textRepresentation){
if(view.getId()==R.id.Image){
if(data instanceof Integer){
Integer ig;
ig = (Integer)data;
view.setBackgroundResource(ig.intValue());
}
if(data instanceof Drawable){
view.setBackgroundDrawable((Drawable)data);
}
}
return false;
}
};
r = getResources();
it = new Intent();
//起動するアプリを限定させて頂きます。
it.setAction(Intent.ACTION_SEND);
it.setType("text/plain");
pm = getPackageManager();
lri = pm.queryIntentActivities(it, PackageManager.MATCH_DEFAULT_ONLY);
Collections.sort(lri, new ResolveInfo.DisplayNameComparator(pm));
data =new ArrayList<Map<String, Object>>();
if(lri.size()==0){
m = new HashMap<String, Object>();
m.put("String", r.getString(R.string.noData));
m.put("Image", 0);
data.add(m);
}
else{
int i;
for(i=0; i<lri.size(); i++){
m = new HashMap<String, Object>();
m.put("String", lri.get(i).loadLabel(pm).toString());
//Drawabledeで取り扱う。
m.put("Image", lri.get(i).loadIcon(pm));
//リソースで取得すると、表示できない。
//m.put("Image", lri.get(i).getIconResource());
data.add(m);
}
//最後に、resource IDによるアイコンを表示する。
m = new HashMap<String, Object>();
m.put("Image", android.R.drawable.ic_menu_revert);
m.put("String", r.getString(R.string.noShare));
data.add(m);
}
sa = new SimpleAdapter(this, data, R.layout.listitem, sFrom, iTo);
sa.setViewBinder(savb);
lv = (ListView)findViewById(R.id.ListView);
lv.setAdapter(sa);//一覧の表示を提供する。
lv.setOnItemClickListener(this);