2011年11月9日水曜日

画像と文字列の一覧表を表示する

画像と文字列の一覧表を表示する

画像と文字列を含む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);

0 件のコメント:

コメントを投稿