SimpleAdapter.ViewBinder方法的感受

我们之前都使用过SimpleAdapter,顾名思义,就是一个非常Simple的Adapter,但是最近在使用GridView做launcher应用时,本意是想显示已安装应用程序的图标以及名称,可是使用SimpleAdapter做适配器时,应用程序图标死活出不来,老是报错“E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: android.graphics.drawable.BitmapDrawable@af91c64: open failed: ENOENT (No such file or directory)”,感觉莫名其妙。后来查询了很多资料,才搞明白怎么回事,特此记录一下。
首先还是先看一下SimpleAdapter的定义吧,直接翻译下SDK doc 吧:
  这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。你可以指定由Map组成的List(比如ArrayList)类型的数据。在ArrayList中的每个条目对应List中的一行。Maps包含每一行的数据。你可以指定一个XML布局以指定每一行的视图,根据Map中的数据映射关键字到指定的视图。绑定数据到视图分两个阶段,首先,如果设置了SimpleAdapter.ViewBinder,那么这个设置的ViewBinder的setViewValue(android.view.View, Object, String)将被调用。如果setViewValue的返回值是true,则表示绑定已经完成,将不再调用系统默认的绑定实现。如果返回值为false,视图将按以下顺序绑定数据:
  • 如果View实现了Checkable(例如CheckBox),期望绑定值是一个布尔类型。
  • TextView.期望绑定值是一个字符串类型,通过调用setViewText(TextView, String)绑定。
  • ImageView,期望绑定值是一个资源id或者一个字符串,通过调用setViewImage(ImageView, int) 或 setViewImage(ImageView, String)绑定数据。
  如果没有一个合适的绑定发生将会抛出IllegalStateException。
改写后的代码如下:
public SimpleAdapter getAdapter() {
        List<Map<String,Object>> mApps = new ArrayList<>();
         for(int i = 0; i < list.size(); i++)
        {
            Map<String,Object> map = new HashMap<>();
            map.put("image", list.get(i).activityInfo.loadIcon(getPackageManager()).getCurrent());
            map.put("name",list.get(i).activityInfo.loadLabel(getPackageManager()));

            Log.v("TTT",list.get(i).activityInfo.loadIcon(getPackageManager()).toString());
            mApps.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,mApps,R.layout.item,new String[]{"image","name"},new int[]{R.id.imageView,R.id.tt});
        adapter.setViewBinder(new SimpleAdapter.ViewBinder(){
                         public boolean setViewValue(View view,Object data,String textRepresentation){
                                if(view instanceof ImageView && data instanceof Drawable){
                                        ImageView iv=(ImageView)view;
                                        iv.setImageDrawable((Drawable)data);
                                        return true;
                                   }
                               else
                                    return false;
                            }
                    });

        return adapter;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值