1. 程式人生 > >Android中的getView

Android中的getView

BaseAdapter就Android應用程式中經常用到的基礎資料介面卡,它的主要用途是將一組資料傳到像ListView、Spinner、Gallery及GridView等UI顯示元件,它是繼承自介面類Adapter,我們經常使用的ListView 的adapter,即SimpleAdapter,是繼承自BaseAdapter的,BaseAdapter是一個基類,沒有實現繫結資料的功能,SimpleAdapter實現了基本控制元件的繫結,如TextView,Button,ImageView).已經為我們實現好了資料優化工作,這些介面卡使用相同元件動態繫結資料的方式進行優化。為什麼需要優化呢?因為如果我們有上億個專案要顯示怎麼辦?為每個專案建立一個新檢視?這不可能,因為記憶體有限制。實際上Android為你快取了檢視。Android中有個叫做Recycler的構件,下圖是他的工作原理:

 

如果你有10億個專案(item),其中只有可見的專案存在記憶體中,其他的在Recycler中。其實我的理解Recyler就是一個佇列,用來儲存不在螢幕範圍內的item,如果item滾出螢幕範圍,那麼就入隊,這裡的滾出是完全滾出,即邊界等也要完全滾出。如果新的item要滾進來,那麼android系統的framework就會檢視Recyler是否含有可以重複使用的iew,如果有那麼就重新設定該iew 的資料來源,然後顯示,即出隊。那麼這麼多的item其實只需要佔用一定空間的記憶體,這個記憶體大小是多少呢?我的感覺是手機螢幕所包含的item的個數,再加上1,然後乘以每個item佔用的記憶體。但是最後我發現是加上2.可能是為了使得快取更大吧。。。。但是為什麼加上2,大家應該理解,如果你不理解,那你就把滾動list的過程好好想一想。那個佇列無非就是一個快取罷了,因為我們的目的是通過那個快取來重複使用那些已經建立的iew。

使用BaseAdapter的話需要過載四個方法,這些方法分別是getCount,getItem,getItemId,最後一個最重要的是getView,getView函式為什麼重要呢?因為它是用來重新整理它所在的ListView的。它在什麼時候呼叫的呢?就是在每一次item從螢幕外滑進螢幕內的時候,或者程式剛開始的時候建立第一屏item的時候。

1、getView(int position,View converView,ViewGroup parent)


int position位置,一般BaseAdapter都是很多型別一樣的資料展示在介面,該屬性是判斷顯示在介面上的是第幾個,通過position在BaseAdapter自定義的陣列或者集合中取值。並展示在介面上。
View converView 展示在介面上的一個item。因為手機螢幕就那麼大,所以一次展示給使用者看見的內容是固定的,如果你List中有1000條資料,不應該new1000個converView,那樣記憶體肯定不足,應該學會控制元件重用,滑出螢幕的converView就在下面新進來的item中重新使用,只是修改下他展示的值

程式碼如下:
View v = null;
        if (convertView == null) {
            v = LayoutInflater.from(context).inflate(
                    R.layout.adapter__item, parent, false);
            Holder vh = new Holder();
            vh.text = (TextView) v.findViewById(R.id.text1);
            v.setTag(vh);
        } else {
            v = convertView;
        }
        Holder vh = (Holder) v.getTag();
        vh.text.setText(data[position]);
        return v;

ViewGroup parent 這個屬性是載入xml檢視時使用。
inflate(R.layout.adapter__item, parent, false);確定他父控制元件,減少寬高的測算