Android开发学习之路-SimpleAdapter源码分析学习
今天在课堂上,老师用到了SimpleAdapter,然后女神在边上问我为什么这个SimpleAdapter不能做到我app那种带有进度条的效果,言语说不清,然后就开始看源代码,发现这个Adapter的实现方式还真的应该好好去研究下,收获还是很多的。
先看构造函数,构造函数传进来一个数据源List<Map>,一个布局文件的Id(resource),一个字符串数组是对应Map里面的Key,还有一个整型数组对应item布局中的每个控件的ID
- public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
- @LayoutRes int resource, String[] from, @IdRes int[] to) {
- mData = data;
- mResource = mDropDownResource = resource;
- mFrom = from;
- mTo = to;
- mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
由此可得,这个Adapter的实现是将from数组的作为key,然后根据to数组得到每个item的控件id,把list中的map的每个数据映射到item中。
接下来,定义了几个重要的方法,这些方法在我们自定义Adapter的时候也需要重写的,getCount是用于计算有多少个item,getItem是根据位置获取对应的数据,getItemId是根据位置来获取每个item的id,这需要我们从数据源中获取相关的参数。
- public int getCount() {
- return mData.size();
- }
- public Object getItem(int position) {
- return mData.get(position);
- }
- public long getItemId(int position) {
- return position;
- }
再接下来就是整个Adapter的重要方法getView,先看代码
- public View getView(int position, View convertView, ViewGroup parent) {
- return createViewFromResource(mInflater, position, convertView, parent, mResource);
- }
- private View createViewFromResource(LayoutInflater inflater, int position, View convertView,
- ViewGroup parent, int resource) {
- View v;
- if (convertView == null) {
- v = inflater.inflate(resource, parent, false);
- } else {
- v = convertView;
- }
- bindView(position, v);
- return v;
- }
- private void bindView(int position, View view) {
- final Map dataSet = mData.get(position);
- if (dataSet == null) {
- return;
- }
- final ViewBinder binder = mViewBinder;
- final String[] from = mFrom;
- final int[] to = mTo;
- final int count = to.length;
- for (int i = 0; i < count; i++) {
- final View v = view.findViewById(to[i]);
- if (v != null) {
- final Object data = dataSet.get(from[i]);
- String text = data == null ? "" : data.toString();
- if (text == null) {
- text = "";
- }
- boolean bound = false;
- if (binder != null) {
- bound = binder.setViewValue(v, data, text);
- }
- if (!bound) {
- if (v instanceof Checkable) {
- if (data instanceof Boolean) {
- ((Checkable) v).setChecked((Boolean) data);
- } else if (v instanceof TextView) {
- // Note: keep the instanceof TextView check at the bottom of these
- // ifs since a lot of views are TextViews (e.g. CheckBoxes).
- setViewText((TextView) v, text);
- } else {
- throw new IllegalStateException(v.getClass().getName() +
- " should be bound to a Boolean, not a " +
- (data == null ? "<unknown type>" : data.getClass()));
- }
- } else if (v instanceof TextView) {
- // Note: keep the instanceof TextView check at the bottom of these
- // ifs since a lot of views are TextViews (e.g. CheckBoxes).
- setViewText((TextView) v, text);
- } else if (v instanceof ImageView) {
- if (data instanceof Integer) {
- setViewImage((ImageView) v, (Integer) data);
- } else {
- setViewImage((ImageView) v, text);
- }
- } else {
- throw new IllegalStateException(v.getClass().getName() + " is not a " +
- " view that can be bounds by this SimpleAdapter");
- }
- }
- }
- }
- }
getView方法直接调用了一个叫做createViewFromResource的方法,这个方法中,先判断convertView是否为空,这个convertView是缓存的一个view,因为我们知道,每个listView中其实是只有来回的几个item,当一个item滑出屏幕的时候,这个item就会被循环利用,来生成下一个显示的view,也就是说,整个屏幕中view的个数是可能会小于data的size的,这里使用到的缓存目的是如果这个view在之前已经生成了,那么我们可以不再重新去映射,直接可以拿回来用,这是一个提升性能的做法。接下来,调用一个bindView的方法,在这个方法中,根据获取到的view的类型,来判断数据应该如何映射到布局中,比如如果view的类型是textview的话,就把数据源的值设置为它的text等,这里只能是checkable、textview和imageview这三种个类和他们的子类可以使用,如果有progressbar这样的,我们就只能自己定义一个adapter了。
Android开发学习之路-SimpleAdapter源码分析学习的更多相关文章
- Android开发学习之路-Volley源码解析
从简单的StringRequest入手看看Volley的工作机制. 先简单说下Volley的用法: ① 获取一个RequestQueue mRequestQueue = Volley.newReque ...
- Android开发学习之路-二维码学习
这个月装逼有点少了,为什么呢,因为去考软件射鸡师了,快到儿童节了,赶紧写篇博纪念一下逝去的青春,唔,请忽略这句话. 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这 ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- 50个Android开发人员必备UI效果源码[转载]
50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
随机推荐
- SpringMVC 的RequestMapping
Spring MVC之@RequestMapping 详解 2013-10-13 23:39 150698人阅读 评论(6) 收藏 举报 分类: Java 精华文章(161) 目录(?)[+] ...
- jQuery基础_1
jQuery事件的因果关系是怎么样的一个格式: $("button").click(function(){ }); [正式接触jQuery] (1)jQuery的书写步骤: 1.引 ...
- 站内信对话列表sql语句
- LR11录制脚本时打不开浏览器,如何解决?
请教一下各位大神,我安装的LR11,在录制脚本的时候打不开浏览器,已经试过了网上的方法还是不行,以下是搜到的方法: 无法打开IE的主要原因是,LR的注册信息被修改了,所以无法找到IE的路径. 解决这个 ...
- Web调用FastReport的配置问题
1.修改配置webconfig文件 IIS6: <system.web> <httpHandlers> <add path="FastReport.Export ...
- Unity 4.x Asset Bundle 重名
在 Unity 4.5.1f3中测试发现如下问题 两个不同文件下相同名字的资源打包成AssetBundle以后加载失败,提示错误 xxxxx can't be loaded because anot ...
- HTML的ul和li标签的使用
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 搜索引擎 ElasticSearch 之 步步为营2 【基础概念】
在正式学习 ElasticSearch 之前,首先看一下 ElasticSearch 中的基本概念. 这些概念将在以后的章节中出现多次,所以花15分钟理解一下是非常值得的. 英文好的同学,请直接移步官 ...
- IOS Alcatraz Xcode6.4安装指南
1.Alcatraz Alcatraz是Xcode上的插件管理器,用过notepad++应该印象深刻,近来在一部新机器 按以前的安装方法安装老是安装不成功.特意查找了下资料,最后安装成功. 2.安装过 ...
- android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变
首先要知道 自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[ ...