您的位置:首页 > 其它

SimpleAdapter.ViewBinder方法的感受

2016-07-09 16:00 429 查看
我们之前都使用过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: