重要的View

用戶界面都是有Acitivity組件,Activity中關聯了一個PhoneWindow創建,在這個窗口下則管理了一個視圖樹。這個試圖樹的頂級試圖就是一個Viewgroup類型的DecorView,DecorView下就是各個視圖控件。
listview加載時會根據數據的個數來創建Item view,根據索引從數據集合中獲取數據,調用getView獲取具體的試圖,並且與數據綁定。但是並不是有多少數據項就會產生多少Item view,android採用了視圖複用的形式來避免創建過多的Item view,這樣能夠非常有效的提升性能和降低內存佔用率。當屏幕向下滾動時,第一項數據將會滾出屏幕的可見範圍之內,並且進入Listview的一個Recycler中,Recycler會將該視圖緩存,而此時下面的數據也需要加載,Listview首先會從 Recycler中獲取視圖,如果視圖存在,那麼用戶可以直接使用該緩存視圖,或者重新創建新的視圖。
getView函數的position就表示該視圖是第幾項數據,convertView就表示緩存的Item view,Listview只會展示有限數量的Item view,例如8個Item view就能夠鋪滿屏幕,那麼即使數據項有1000個,通過複用機制Item view可以只產生8個,這樣既節約內存又能很大程度上提高運行效率。複用Itemview機制也是優化Listview等集合組件最重要的手段。
Listview運用了Adapter模式,在Adapter中還用了觀察者模式。Adapter內部有一個可觀察者類,Listview則作爲它的其中一個觀察者。在將adapter設置給Listview時,Listview會被註冊到這個觀察者對象中。Listview就是通過Adapter模式、觀察者模式、Item View複用機制實現了高效的列表顯示。
RecyclerView將替代listview而出現,它的設計與listview類似,也使用了adapter,這個adapter是RecyclerView的一個靜態內部類。RecyclerView還封裝了一個ViewHolder類型,該類型中有一個itemview字段,代表的就是每一項數據的根視圖,需要在構造函數中傳遞給ViewHolder對象。RecyclerView這麼設計相當於android團隊將listview的adapter進行了再次封裝,把getView函數中判斷是否含有緩存的代碼封裝到RecyclerView內部,使這部分邏輯對用戶不可見。用戶只需要告訴RecyclerView每項數據是怎麼樣的以及將數據綁定到每項數據上,分別對應的函數爲onCreateViewHolder函數、onBindViewHolder函數。用戶只需要完成具體的ViewHolder構造以及數據綁定即可。它的另一個特點就是將佈局方式抽象爲LayoutManager,默認提供了LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager佈局。RecyclerView通過橋接的方式將佈局職責抽離出去,通過組合的形式可以方便修改佈局方式。還有RecyclerView對於Item view的控制也更爲精細,可以通過ItemDecotation爲Item View添加裝飾,也就是在Item view上進行二次加工;又可以用ItemAnimator爲Item View添加動畫。職責分明、結構清晰使得RecyclerView具有了非常好的擴展性,這也是它成爲未來幾年最重要控件的原因。
ViewPage和Fragment結合在一起使用時簡直可稱爲"黑白雙煞",android也深知其的重要性,因此提供了幾個適用於Fragment的Adapter。通常來說,定製含有Item view類型的控件都應該使用Adapter模式,因爲你不知道用戶的Item view是怎樣的,你只能通過一個Adapter來進行抽象,讓用戶將具體的視圖、數據通過Adapter進行操作。例如,通過getitem獲取某個數據、通過getView獲取每個Item view,這樣一來變化的部分就交給用戶來實現,控件只需關注自身的邏輯,然後通過Adapter的getView來獲取每個Item view即可。ViewPage內部同樣也維護了一個視圖集合,這些視圖集合橫向佈局,用戶可以通過左右滑動來進行頁面切換。ViewPage通常都用於顯示Fragment,而ViewPage與Fragment組合時通常會有一個指示器ViewPagerIndicator來表明當前顯示的是哪個頁面。ViewPagerIndicator會與ViewPager進行管理,並且通過viewpager的adaper(FragmentPagerAdapter)獲取頁面數量、每個頁面的標題等信息,然後繪製出指示器視圖。當ViewPager滾動時,指示器視圖也會發生相應的變化,以此達到指示頁面的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章