`
jerrymo
  • 浏览: 4503 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

android用户界面编程技巧——如何使用Adapter

阅读更多

首先我要说明的是这里“android用户编程技巧”系列的文章中所涉及的技术技巧以及讲述方式不是我本人原创。这些技巧是来自2009年google开发者日 (Google Developer Day 2009)上,google公司一位负负责android系统framework层和浏览器开发的一位工程师(很抱歉没有能记住她的名字)的技巧 ,因为是在开发者大会上演讲是分享的,所以很多人称之为官方的技巧。 当然演讲的具体内容大家可以通过网络轻易得到我也会在后期的文章中给出演讲视频的地址和文档下载地址。我这这里写出来主要是想这样的技术人跟多的知 道和使用。过了一年的时间或许这些技巧中有些已经有待更新,那么就让我们一起在这里讨论吧。 


 重点说演讲中的第一部分——如何使用Adapter。 
 ·
  •  adapter和listview以及数据源之间的关系 
listview相信是大家熟知的一种视图控件了,那么在Adapter相信大家也是一定不会陌生。正如这位是工程师说话Adapter是listview和数据源之间的中间人。 关系如图所示。图片是演讲时所用ppt中的图片。
android用户界面编程技巧——如何使用Adapter - 琴弦jerry - 琴弦jerry
 
 adapte listview 数据源之间的关系图

 当我们滑动listview的时候每一条数据进入可见区域的时候adapter的getView方法就会被调用,返回代表具体数据的视图。那么当我们的listview中有多条数 据的时候(一般都是有多条数据的),getView方法就会反复多次的频繁调用。这样的listview就可以显示很多数据,即成百上千条数据。 那么显而易见,由于getview方法是频繁调用的我们应该经历的在这个方法中尽可能少的产生对象,最大可能大的提高这个方法的工作效率。这样我们的list的 更新速度才不至于太慢。

  •  剖析listview

 让我们来虚拟一个listview 我们假设这个listview的可见区域中有7个listview,当我们用手指向上滑动一个item的时候,第一条数据就离开了可见区域。在 android系统上,为了有效的使用java机制,设立了回收区域。那么离开可见区域的数据就进入了会回收区域,以便于以后再次使用。adpater怎么会对应的 标记这个离开可见区域的数据项,adapter同时会生产第八个视图的数据并显示在可见区域。这个就完了listview的一次更新。 

  •  简单示例 
 我们假设需要完成的listview的每一个数据视图如图所示:
android用户界面编程技巧——如何使用Adapter - 琴弦jerry - 琴弦jerry
 
 示例布局 它的布局文件如下: 
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”horizontal”>
<ImageView android:id=”@+id/icon”
android:layout_width=”48dip”
android:layout_height=”48dip” />
<TextView android:id=”@+id/text”
android:layout_gravity=”center_vertical”
android:layout_width=”0dip”
android:layout_weight=”1.0″
android:layout_height=”wrap_content” />
</LinearLayout>
 
  •  最简单的方法: 
public View getView(int pos, View convertView,

ViewGroup parent){

View item = mInflater.inflate(R.layout.list_item, null);

((TextView) item.findViewById(R.id.text)).

setText(DATA[pos]);

((ImageView) item.findViewButId(R.id.icon)).

setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);

return item;

}
 
 
inflate方法每次调用getview方法的时候都会调用,但是我们发现 每一个view都是同样的操作。最主要的是,正如我们前面所说当,一个item视图从可见区 域被滑动到不可见区域之后,它会进入会区域,但我们再次让这个item进入可见区域的时候我们完全没有必须有再次调用 inflate方法来展开视图,所以这个 部分,我们可以利用converView来做一个判断,当converView是null时,也就是回收区域中么有我们要显示的视图的时候我们才去调用inflate方法展开视图 布局。这样我们就可以对代码进行简单有效的优化。 

  • 利用convertView回收视图, 效率提高 200% 
public View getView(int pos, View convertView,

ViewGroup parent){

if (convertView == null) {

convertView = mInflater.inflate(

R.layout.list_item, null);

}

((TextView) convertView.findViewById(R.id.text)).
setText(DATA[pos]);

((ImageView) convertView.findViewButId(R.id.icon)).

setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}
 
相同,我们会发现findviewbyid这里的计划代码也是每次都要调用,我们是不是可以有一个什么方法,让这些操作也像前面的一样回收起来呢。这个时候我们 考虑使用viewholder模式。我们首先写一个静态的类,将每一个item的子视图,一个图片视图和一个文本视图缓存或者说是回收在这个静态类中,这样我们 就可以节省一些执行findviewbyid方法的时间。这样我们又一次可以优化代码。 

  • 利用ViewHolder模式,效率再次调高50% 
 ViewHolder静态类: 
static class ViewHolder {

TextView text;

ImageView icon;

}
 
getview方法代码如下:

public View getView(int pos, View convertView, ViewGroup parent){

ViewHolder holder;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item, null);

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(

R.id.text));

holder.icon = (ImageView) convertView.findViewButId(

R.id.icon));

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.text.setText(DATA[pos]);

holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}
 
 
 最后呢,这位工程师对这三种方式进行了一个更新数据的比较,用一般的方法每秒更新8个frame,采用回收机制的方法是每秒27个frame,采用ViewHolder 模式方法每秒36个frame。 
 更新效率比较图:
android用户界面编程技巧——如何使用Adapter - 琴弦jerry - 琴弦jerry
 
 三种方式更新效率比较 最后,着这次演讲中一个设计了5个模块的编程技巧,如下:
 · Adapter的使用 
 · 图像和背景 
 · 更新请求 
 · 视图和布局
 · 内存分配 
后续我会陆续将其他部分在这里发布,再次申明这些方法是09年google开发者大会分享的,我不知道为什么这些方法按理来说应该早为我们中国开发者所熟 知,可是我在很多社区中看多有很多朋友还在找出找这些问题的答案。因此我再次将这些技巧整理发布出来,希望更多的朋友在使用搜索引擎的时候可以找到 这些技巧。

1
2
分享到:
评论

相关推荐

    Android 用户界面编程技巧

    技巧和设计模式 如何使用Adapter 背景和图像 更新请求 视图和布局 内存分配

    6.Android界面编程(3补充)Adapter.pptx

    6.Android界面编程(3补充)Adapter.pptx

    Android自定义adapter的listview

    Android自定义adapter的listview代码

    《Android高级编程》

    11.1 Android的安全性 11.1.1 Linux内核安全 11.1.2 权限简介 11.1.3 声明和实施权限 11.1.4 为广播Intent实施权限 11.2 使用AIDL来支持服务IPC 11.3 使用Internet服务 11.4 构建内容丰富的用户界面 11.4.1 使用动画...

    Android中ListView+Adapter

    基于Eclipse开发平台,Android中使用ListView和三种适配器(ArrayAdaper,SimpleAdapter,BaseAdapter)实现数据的填充。

    Android简单使用ListView和Adapter

    Android简单使用Listview和Adapter实现数据显示,通过按钮删除ListView中的子项

    Android Adapter的使用

    本代码深入讲解了Android适配器各种对象的使用,适合初学者学习。

    Android高级编程.pdf

    4.2.1 使用View创建Activity(活动)用户界面 4.2.2 Android Widget工具箱 4.3 布局简介 4.4 创建新的View 4.4.1 修改现有的View 4.4.2 创建复合控件 4.4.3 创建定制的Widget和控件 4.4.4 使用定制的控件 4.5 创建和...

    Android高级编程 part2

     4.2.1 使用View创建Activity(活动)用户界面  4.2.2 Android Widget工具箱  4.3 布局简介  4.4 创建新的View  4.4.1 修改现有的View  4.4.2 创建复合控件  4.4.3 创建定制的Widget和控件  4.4.4 使用定制的...

    Android代码-android-object-adapter

    Android ObjectAdapter Version: Java Kotlin Adapter that is similar to the ObjectAdapter (ArrayObjectAdapter) from the Leanback support library. ChangeLog 1.4 migrate to androidx Gradle Java ...

    android中adapter的使用

    android中ArrayAdapter SimpleAdapter BaseAdapter 的使用

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

    Android支持DataBinding的RecyclerView通用Adapter

    基于BRVAH改造而来,支持几乎所有原生RecyclerView.Adapter所能实现的需求,支持DataBinding数据绑定的通用RecyclerView的Adapter

    Android高级编程--源代码

     ◆如何使用布局和定制view创建用户界面  ◆存储和共享应用程序数据的技术  ◆如何创建基于地图的应用程序,如何使用gps和地理编码位置等基于位置的服务  ◆如何创建和使用后台服务及notification  ◆使用加速...

    Android代码-android-Stupid-Adapter

    android-Stupid-Adapter 一个比较蠢的adapter,一切只是为了少写两行代码, 支持listview,gridView, recyclerview, 的adapter, 开发者只需要关注 item View 和 数据的关系,业务逻辑.剩下的一切交给我 将viewholder,与 ...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

    Android代码-Android_Learning_Notes

    用户界面 9、Android09--Fragment初探 10、Android09--Android程序界面 11、Android11--基本布局 12、Android12--常见控件(一) 13、Android13--常见控件(二) 14、Android14--Adapter 15、Android15--ListView 16、...

    Android代码-快速使用的RecyclerView Adapter。

    建立一个ViewHolder,然后使用fastAdapter.addItem即可使用,无需创建复杂的RecylerView Adapter和ViewHolder。 如何使用它? 1.在项目的build.gradle文件添加 implementation '...

    Android高级编程 part1

     4.2.1 使用View创建Activity(活动)用户界面  4.2.2 Android Widget工具箱  4.3 布局简介  4.4 创建新的View  4.4.1 修改现有的View  4.4.2 创建复合控件  4.4.3 创建定制的Widget和控件  4.4.4 使用定制的...

Global site tag (gtag.js) - Google Analytics