`
四眼蛤蟆
  • 浏览: 97664 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

adapte listview 数据源之间的关系图

 

当我们滑动listview的时候每一条数据进入可见区域的时候adapter的getView方法就会被调用,返回代表具体数据的视图。那么当我们的listview中有多条数据的时候(一般都是有多条数据的),getView方法就会反复多次的频繁调用。这样的listview就可以显示很多数据,即成百上千条数据。

显而易见,由于getview方法是频繁调用的我们应该经历的在这个方法中尽可能少的产生对象,最大可能大的提高这个方法的工作效率。这样我们的list的更新速度才不至于太慢。

 

  • 剖析listview

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

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;
}
 
分享到:
评论

相关推荐

    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