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 吧:
如果View实现了Checkable(例如CheckBox),期望绑定值是一个布尔类型。
TextView.期望绑定值是一个字符串类型,通过调用setViewText(TextView, String)绑定。
ImageView,期望绑定值是一个资源id或者一个字符串,通过调用setViewImage(ImageView, int) 或 setViewImage(ImageView, String)绑定数据。
改写后的代码如下:
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; }
相关文章推荐
- 浅谈树状数组
- 用Ant实现Java项目的自动构建和部署
- 【Hibernate 5】继承映射配置及多态查询
- CSS3盒模型box-sizing属性详解,布局更方便
- MyEclipse关联Hibernate,Spring的源码
- JQuery的遍历
- Android SwipeRefreshLayout{v4包中带的}扩展SwipyRefreshLayout实现下拉刷新,下拉加载
- 如何快速转载CSDN中的博客
- 剑指offer之面试题17 :合并两个排序的链表
- Node.js GET/POST请求
- 跟王老师学MySQL:单表查询
- 【Hibernate 5】继承映射配置及多态查询
- 4、表的操作:增删改、约束 ---第2篇
- codeforces 689E E. Mike and Geometry Problem(组合数学)
- 学习javaee的第四天
- JZOJ.4596 Stree
- UIWebView详解
- [从头读历史] 第291节 神之物语 七英雄远征底比斯
- (译)360全景视频制作专题-介绍
- 第二份工作入职培训总结