Android 進階 (1)

Custom ListView

ListView 與 Adapter

  • 資料(Data) 是要呈現的內容
  • ListView 是清單顯示的一個元件,可以說是呈現結果的容器
  • 資料要怎麼被擺在 UI 上,就是 Adapter 的工作了!
  • Datas   -->   Adapter   -->   ListView

資料來源: 這裡

BaseAdapter 主要的 function

  • getCount() -- 取得資料數量
  • getItem() -- 依照位置取得資料
  • getView() -- 資料與畫面的連接處
  • 其中 getView() 最重要!
    畫面複雜時,通常會寫一個 ViewHolder,讓程式更容易讀

ListView 主要的工作原理

  • ListView 對 List 中每一個項目(item),要求 Adapter 給他一個畫面 (getView())
  • 一個新的畫面被顯示

如果現在資料有 1,000,000 筆

Android 會一次幫你畫出全部的資料嗎?

不!

記憶體早就不夠了吧!

所以 Android 有一個東西,叫做 Recycler 的機制,幫你處理這件事!

getView() 運作機制

  • 1,000,000 筆資料中,只有可見的部分被放入記憶體中,其他的在 Recycler 裡
  • ListView 先拿一個第一種 (type1) 畫面,並且此時的 convertView 在 getView() 中為空 (null)
  • 當 item1 被滑出螢幕了,並且有一個新的項目從底下被滑出來時,ListView 會再拿一個 type1 畫面。此時 convertView 的值 = item1
  • 只要 item1 又被滑入螢幕,convertView 會丟出來,不用從新畫一個新的畫面,減少了不必要的工作

ViewHolder 的作用?

  • 將需要被快取 (cache) 的 View 封裝好, convertView 的 setTag 將這些快取存起來,供下一次存取用
  • 當畫面越來越複雜時, viewHolder 就有明顯的差別了
  • 畫面不複雜時,也有效能上的增強

Inflater vs findViewById()

  • Inflater 英文翻譯為「膨脹」。在這裡,我們姑且看作「擴展」、「延伸」
  • 對於一個沒有被載入或者想要動態載入的界面 (版面配置),都需要使用inflate來載入
  • findViewById() 不同的是,Inflater 是用來找 layout 下的 xml 界面檔,並且實體化
  • findViewById() 是用來找 xml 中某個 widget (例如:TextView, Button)
  • View 實體化以後,可以用 findViewById() 搜尋界面中的特定元件

參考資料

  • getView()的原理:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html
  • getView()的原理:http://blog.csdn.net/harvic880925/article/details/25335957
  • ViewHolder:http://www.cnblogs.com/xiangtailiang/p/3379543.html
  • Inflater:http://www.cnblogs.com/yourancao520/archive/2012/04/06/2434745.html

最後...

程式碼可以在以下網址找到:
https://github.com/Oschangkai/2018Android-at-HSNU

以下是所有的上課簡報:
https://slides.kaiyeee.tw/2018/q1/basic-android01/ https://slides.kaiyeee.tw/2018/q1/basic-android02/ https://slides.kaiyeee.tw/2018/q1/basic-android03/ https://slides.kaiyeee.tw/2018/q1/basic-android04/ https://slides.kaiyeee.tw/2018/q1/advanced-android01/

最後的最後...

以下是所有的實作簡報:
https://slides.kaiyeee.tw/2018/q1/android-lab01/ https://slides.kaiyeee.tw/2018/q1/android-lab02/ https://slides.kaiyeee.tw/2018/q1/android-lab03/

我的聯絡方式...
Email:  [email protected]
FB:  https://fb.com/kaiyeeeee
Telegram:  @kaiyeee

謝謝大家