Adapter的适用范围

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  — 《设计模式》GOF
Adapter模式的宗旨就是,基于现有类所提供的服务,向客户端提供接口,以满足客户的期望。—《java设计模式 》

适配器是AdapterView视图与数据之间的桥梁,用来处理数据并将数据绑定到AdapterView上。AdapterView对象有两个主要任务
1. 在布局中显示数据
2. 处理用户的选择

android提供多种适配器,开发时可以针对数据源的不同采用最方便的适配器,也可以自定义适配器完成复杂功能。

  • BaseAdapter一般的适配器基类可用于将数据绑定到listview、Gallery、GridView 、spinner、AutoCompleteTextView上,当然也可以绑定到ExpandableListView
  • BaseExpandableListAdapter可扩展的适配器基类,可用于将数据绑定到支持展开/收缩功能的列表控件ExpandableListView上,ExpandableListView继承自ListView
  • 当数量较多,比如超过100条或频繁动态增减时使用arrayadapter可以方便控制ui如果仅仅为了显示则使用baseadapter更节省资源

  • ListView控件是竖向滑动的,复用convertView,我们可以加载成千上万的数据; 我们想横向滑动的相册,并且数据有好多,这时候ViewPager控件。
  • ViewPager和ViewFlipper用法类似,但是更好用,左右滑动效果好,而且有类似于ListView的Adapter—PagerAdapter基类,提供回收内存,复用
    • void destroyItem(View container, int position, Object object)//左右滑动的时候,回收较早前的itemView.
    • int getCount()  //ViewPager里显示内容的条数.
    • Object instantiateItem(View container, int position) //初始化ItemView.
  • 设置ViewHolder 为static,也就是静态的,静态类只会在第一次加载时 会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。

使用国际化接口 字符数组来 给ArrayAdapter 赋值

<string-array name=”letter”>
<item>A</item>
<item>B</item>
<item>C</item>
<item>D</item>
</string-array>

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.letter,android.R.layout.my_list_item)//只需要显示

ArrayAdapter<CharSequence> adapter = new ArrayAdapter(this,android.R.layout.my_list_item,Arrays.asList(getResources().getTextArray(R.array.letter)))//允许动态增删

在自定义ListView的样式时,需要重写数据接口的ListAdapter类中的getView函数,以此来定制ListView中每个item的样式。当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。在ListView滑动的过程中,每次getView被执行都会new出一个View对象,长此以往会产生很大的消耗,特别当item中还有Bitmap等 甚至会造成OOM的错误导致程序崩溃

在这里Android系统为了效率的原因引进了ConvertView这一个变量。

  • ConvertView是个view 的缓存,优化:如果存在就不需要重新创建了,没有的话需要通过inflate方法获取。 这样就避免了反复创建大量view的问题。当ListView滑动的过程中,会有item被滑出屏幕而不再被使用,这时候Android会回收这个条目的view 这个view也就是这里的convertView

根据getView调用时间顺序,依次保存convertView。当下一次ListView重写UI,按先进后出的顺序传递给getView函数。

  • Viewholder是个自定义静态类,通过gettag()/settag()convertview关联起来,作用是减少findViewById的次数。因为findViewById会消耗大量时间。
  • View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。可以用在多个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器就通过getTag来分辨是哪个Button 被按下。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

%d bloggers like this: