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

來源:互聯網
上載者:User

標籤:==   螢幕   settag   can   可見   緩衝   family   too   標籤   

Android Adapter基本理解:

 

我的理解是:

1、一個有許多getter的類(就是getView(),getCount()....這些方法)

2、有多少個get方法?都是什嗎?

 

這些getter是特定的,你可以複寫他們,全部的方法如下

其中一般我們只用複寫getCount(),getView(),getItemId(),getItem()這四個方法

 

 

3、這些被誰調用?

 

這些getter是被android系統自行調用的(具體如何調用,作為像我這樣的新手做稍微瞭解就好)

 

4、為什麼要複寫這些get方法?

 

複寫這些getter是為了返回給android系統,自己想給的結果

 

5、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)

 

後做詳解

….

 

6、android系統得到這些為了幹什嗎?

 

得到這些資訊以便繪製出這個View,以及以怎麼樣的方式繪製…

 

 

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

 

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

 

一、原理的理解

工作原理:

  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,不必重新建立一個視圖。

 

二、代碼的理解

 

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.