使用Android L新特性開源項目-Aiguille
原文 http://www.cnblogs.com/kevinOne/p/4487202.html
項目地址: https://github.com/wwkai555/Aiguille
這個項目主要使用Android L新特性 - 最新的widget以及一些值得推薦和使用的開源庫比如butterknife,volley等等。然而后續也將會采用更多優秀的開源技術展示。這篇文章先就大致的介紹下該項目采用的最新widge知識和相關的開源庫技術。
1.RecyclerView
RecyclerView可以說是ListView的升級版,因為它使用起來非常的方便和簡單。可以看下谷歌的官方文檔:
RecyclerView is a more advanced and flexible version of ListView . This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically.
我們可以看出,RecyclerView就是用來顯示大量數據的容器和ListView一樣。它可以非常高效的重用和滾動,當你的視圖上的元素經常動態的且有規律的改變時候,可以使用RecyclerView控件。我們之前在使用listview的時候,都會負責為每一個item布局管理,同時還有自己處理item的復用機制,用多了就會感覺挺累贅的,然而RecycleView將不再有這些問題的存在了,RecyclerView現在不再負責布局,只專注于復用機制,布局交由LayoutManager來管理。 RecyclerView仍然通過Adapter來獲取需要顯示的對象,只不過這個Adapter不再是繼承BaseAdapter而是繼承 RecycleView自帶的RecyclerView.Adapter,并且最好指定一個繼承自RecyclerView.ViewHolder的范型,Adapter不再要求你返回一個View,而是一個ViewHolder。繼承自Adapter后,需要實現3個抽象方法:
1>.當RecyclerView需要一個ViewHolder時會回調該方法,如果有可復用的View則該方法不會得倒回調public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i);
2>.當一個View需要出現在屏幕上時,該方法會被回調,你需要在該方法中根據數據來更改視圖
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i);
3>.用于告訴RecyclerView有多個視圖需要顯示
public int getItemCount();
新的Adapter和原有的Adapter并沒有太多的差別,只是不再需要我們寫復用判斷的邏輯,因為復用邏輯其實都是相似的,它已經有了自身的實現。和原有的Adapter一樣,仍然可以通過notifyDataSetChanged來刷新UI,通過getItemViewType來獲取對應位置的類型,但是它不再需要你指定有多少類型了,因為該方法已經能夠判斷出有多少類型。新增的onViewRecycled方法可以讓使用者監聽View被移除屏幕的時機,并且還提供了一個AdapterDataObserver的觀察者,對外提供數據改變時的回調。
ViewHolder是對所有的單個item的封裝,不僅包含了item需要顯示的View,并且還包含和item相關的其它數據,例如:當前的position、之前的position、即將顯示的position、被回收的次數、View的類型、是否處于顯示中等信息。創建一個ViewHolder需要傳遞一個View對象,這個View就是該holder的顯示視圖,該View中通常會包含一些子視圖,我們最好把這些子視圖都記錄在holder中,便于復用時設置不同的數據。
RecyclerView不再對布局進行管理,而是通過LayoutManager管理布局,我們可以通過繼承自LayoutManager來實現特殊的布局,系統提供了三種常用的布局管理器:
- LinearLayoutManager 線性布局
- GridLayoutManager 九宮格布局
- StaggeredGridLayoutManager 瀑布流布局
并且每一種都可以設置橫行和縱向的布局,可惜的均不能添加header,如果要添加header,我們可以在Adapter中使用不同的類型來達到該效果。
RecyclerView默認提供了item的增加和刪除的動畫效果,如果我們使用自定義的動畫,需要繼承繼承RecyclerView.ItemAnimator類,時候時,通過RecyclerView.setItemAnimator()方法來設置我們自定義的動畫。
2.CardView
CardView繼承自FrameLayout類,在實現扁平化的UI處理上,通常離不開陰影和圓角,我們通常是讓美工提供一個帶有陰影和圓角效果的背景圖片,現在我們有了更好的實現方式,那就是CardView。,可以在一個卡片布局中一致性的顯示內容,卡片可以包含圓角和陰影。CardView是一個Layout,所以可以布局其他View。對于其的陰影效果和圓角效果更其它的view一樣既可以在xml布局中設置也可以在代碼中直接設置,陰影效果可以使用cardElevation屬性或者使用setCardElevation方法即可達到一致的效果,圓角效果則可以使用cardCornerRadius屬性或者setRadius方法即可一致
3.ToolBar
ToolBar也是Android L中引入一個新widget,可以把他視為actionbar的升級版,因為它可以取代actionbar了。我們知道以往我們在使用actionbar的時候非常不靈活因為它是一個固定的形式,然而toolbar將會改變這一切,我們先看下官方給出的文檔:
-
Use a Toolbar as an Action Bar when you want to use the existing Action Bar facilities (such as menu inflation and selection, ActionBarDrawerToggle, and so on) but want to have more control over its appearance.
-
Use a standalone Toolbar when you want to use the pattern in your app for situations that an Action Bar would not support; for example, showing multiple toolbars on the screen, spanning only part of the width, and so on.
(1)將Toolbar當作actionbar來使用。這種情況一般發生在你想利用actionbar現有的一些功能(比如能夠顯示菜單中的操作項,響應菜單點擊事件,使用ActionBarDrawerToggle等),但是又想獲得比actionbar更多的控制權限。
(2)將Toolbar當作一個獨立的控件來使用,這種方式又名Standalone。
如果你要使用第一種方式,toolbar的具體的表示就可以通過xml布局定制化實現。那么之前你得要去掉actionbar,最簡單的方法是使用Theme.AppCompat.NoActionBar主題。或者是設置主題的屬性android:windowNoTitle為true。然后在Activity的onCreate中調用setSupportActionBar(toolbar),原本應該出現在ActionBar上的menu會自動出現在actionbar上。同樣你如果采用第二種方法,將Toolbar當作一個獨立的控件來使用是不需要去掉actionbar的(兩者可以共存),可以使用任意主題。但是在這種情況下,menu菜單并不會自動的顯示在Toolbar上,Toolbar也不會響應菜單的回調函數,如果你想讓menu菜單項顯示在Toolbar上,必須手動inflate menu。
4.Palette
Palette就是一個取色器,它可以從圖像中提取突出的顏色,這樣可以把色值賦給toolbar、或者其他view,可以讓界面整個色調統一。
Palette這個類中提取以下突出的顏色:
Vibrant (有活力)
Vibrant dark(有活力 暗色)
Vibrant light(有活力 亮色)
Muted (柔和)
Muted dark(柔和 暗色)
Muted light(柔和 亮色)
具體實現見Aiguille項目。
5.butterknife
ButterKnife是一個專注于Android系統的View注入框架,讓你從此從這些煩人臃腫的代碼中解脫出來。具體的實現細節這里就不列舉,可以直接看項目源碼,一看就明白就會使用了。(使用時別忘了配置,配置的過程網上應該不少,如果實在還是有問題可以留言)。
6.volley
Volley 是 Google 推出的 Android 異步網絡請求框架和圖片加載框架。在 Google I/O 2013 大會上發布。從名字由來和配圖中無數急促的火箭可以看出 Volley 的特點:特別適合數據量小,通信頻繁的網絡操作。(個人認為 Android 應用中絕大多數的網絡操作都屬于這種類型)。
Volley 的主要特點
(1). 擴展性強。Volley 中大多是基于接口的設計,可配置性強。
(2). 一定程度符合 Http 規范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的處理,請求頭的處理,緩存機制的支持等。并支持重試及優先級定義。
(3). 默認 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 實現
(4). 提供簡便的圖片加載工具。
以上就大致的介紹了下,具體的各個widget以及開源庫的使用細節,Aiguille項目都給出了,歡迎fork。