[转]Android Adapter以及getView()方法的理解

Android Adapter基本理解:html

 

个人理解是:java

一、一个有许多getter的类(就是getView(),getCount()....这些方法)android

二、有多少个get方法?都是什么?缓存

 

这些getter是特定的,你能够复写他们,所有的方法以下spa

其中通常咱们只用复写getCount(),getView(),getItemId(),getItem()这四个方法.net

 

 

三、这些被谁调用?设计

 

这些getter是被android系统自行调用的(具体如何调用,做为像我这样的新手作稍微了解就好)htm

 

四、为何要复写这些get方法?对象

 

复写这些getter是为了返回给android系统,本身想给的结果blog

 

五、android系统经过这些getter能获得什么?

 

获得这个view自身的一些信息

 

eg:以ListView中的Adapter为例,其中

 

public int getCount() 

 

返回ListView中要显示的子View数量,就是item的总数量

 

public Object getItem(int position)

 

返回一个子View,即ListView中的一个子条目

 

public long getItemId(int position)

 

返回一个item的id,由参数position决定是哪一个id

 

public View getView(int position, View convertView, ViewGroupparent)

 

后作详解

….

 

六、android系统获得这些为了干什么?

 

获得这些信息以便绘制出这个View,以及以怎么样的方式绘制…

 

 

View getview(int position, View convertview, ViewGroup parent )的理解:

 

引用自:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html其中也有一案例帮助理解

 

1、原理的理解

工做原理:

  1. ListView 针对List中每一个item,要求 adapter “给我一个视图” (getView)。
  2. 一个新的视图被返回并显示

若是咱们有上亿个项目要显示怎么办?为每一个项目建立一个新视图?NO!这不可能!

实际上Android为你缓存了视图。

Android中有个叫作Recycler的构件,下图是他的工做原理:

  1. 若是你有10亿个项目(item),其中只有可见的项目存在内存中,其余的在Recycler中。
  2. ListView先请求一个type1视图(getView)而后请求其余可见的项目。convertView在getView中是空(null)的。
  3. 当item1滚出屏幕,而且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据而后返回convertView,没必要从新建立一个视图。

 

2、代码的理解

 

Google官方的demo代码:

 

[java]  view plain  copy
 
  1. <span style="font-family:Courier New;font-size:12px;">public View getView(int position, View convertView, ViewGroup parent)   
  2. {   
  3.     // A ViewHolder keeps references to children views to avoid unneccessary calls   
  4.     // to findViewById() on each row.   
  5.   
  6.     ViewHolder holder;   
  7.     // When convertView is not null, we can reuse it directly, there is no need   
  8.     // to reinflate it. We only inflate a new View when the convertView supplied   
  9.     // by ListView is null.   
  10.   
  11.     if (convertView == )   
  12.     {   
  13.         convertView = mInflater.inflate(R.layout.list_item_icon_text, );   
  14.         Log.v("tag", "positon "+position+" convertView is null, "+"new: "+convertView);   
  15.         // Creates a ViewHolder and store references to the two children views   
  16.         // we want to bind data to.   
  17.         holder = new ViewHolder();   
  18.         holder.text = (TextView) convertView.findViewById(R.id.text);   
  19.         holder.icon = (ImageView) convertView.findViewById(R.id.icon);   
  20.         convertView.setTag(holder);   
  21.     }   
  22.     else   
  23.     {   
  24.         // Get the ViewHolder back to get fast access to the TextView   
  25.         // and the ImageView.   
  26.         holder = (ViewHolder) convertView.getTag();   
  27.         Log.v("tag", "positon "+position+" convertView is not null, "+convertView);   
  28.     }   
  29.   
  30.     // Bind the data efficiently with the holder.   
  31.     holder.text.setText(DATA[position]);   
  32.     holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);   
  33.     return convertView;   
  34. }   
  35.    
  36. static class ViewHolder   
  37. {   
  38.     TextView text;   
  39.     ImageView icon;   
  40. } </span>  

 

下两段引用自:http://blog.csdn.net/pkxiuluo01/article/details/7380974

convertView参数的理解:

每次显示一个item都调用一次getview方法可是每次调用的时候covertview为空(由于尚未旧的view),当显示完了以后。若是屏幕移动了以后,而且致使有些Item(也能够说是view)跑到屏幕外面,此时若是还有新的item须要产生,则这些item显示时调用的getview方法中的convertview参数就不是null,而是那些移出屏幕的view(旧view),咱们所要作的就是将须要显示的item填充到这些回收的view(旧view)中去,最后注意convertview为null的不只仅是初始显示的那些item,还有一些是已经开始移入屏幕可是尚未view被回收的那些item。

 

setTag()和getTag()的理解:

 

view的setTag和getTag方法其实很简单,在实际编写代码的时候一个view不只仅是为了显示一些字符串、图片,有时咱们还须要他们携带一些其余的数据以便咱们对该view的识别或者其余操做。因而android 的设计者们就创造了setTag(Object)方法来存放一些数据和view绑定,咱们能够理解为这个是view 的标签也能够理解为view 做为一个容器存放了一些数据。而这些数据咱们也能够经过getTag() 方法来取出来。

到这里setTag和getTag你们应该已经明白了。再回到上面的话题,咱们经过convertview的setTag方法和getTag方法来将咱们要显示的数据来绑定在convertview上。若是convertview 是第一次展现咱们就建立新的Holder对象与之绑定,并在最后经过return convertview 返回,去显示;若是convertview 是回收来的那么咱们就没必要建立新的holder对象,只须要把原来的绑定的holder取出加上新的数据就好了。

 

 

我理解过程当中所看的文章:

源头上理解Adapter,以及一个案例

http://blog.csdn.net/chunqiuwei/article/details/39934169

帮助理解

http://blog.csdn.net/primer_programer/article/details/23064767

相关文章
相关标签/搜索