今天要利用Youbike場站資訊的OpenData來練習MVVM的架構,主要功能就是每30秒去抓一次資料然後顯示出來。這邊會拆分成幾個步驟來做,首先會先把資料的部分處理好,也就是Call API的部分;再來會實作LiveData及DataBinding的功能,那就來看看該怎麼做吧!
資料來源
這次使用的是由台北市政府提供的「YouBike臺北市公共自行車即時資訊」
API名稱:YouBike臺北市公共自行車即時資訊
API網址:https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json
引入套件
由於會使用到KAPT(Kotlin的Annotation Processing),DataBinding,anko,recyclerView及lambda的寫法,所以需要對Gradle檔案做些修改。
KAPT
DataBinding
Anko
RecyclerView
Lambda
資料抓取
我們先來看API抓回來的資料結構,並依這個資料結構建立對應的data class「StationData」
我們需要用到的資料是retVal裡面的jsonObject,所以我們可以把StationData設計成這樣
接著就可以開始著手接資料了,我們先建立一個對應MainActivity的MainViewModel,在這個ViewModel裡面我們會宣告一個LiveData形式的stationList,然後會有一個getBikeDataFromServer的函示去抓取資料並轉換成StationData的類別存放進stationList裡,最後會有一個startRetrieveData的函示讓他每30秒觸發getBikeDataFromServer一次去更新資料。
由於會使用到網路,所以要記得先到AndroidManifest.xml裡去新增網路的權限
資料呈現
接著我們來處理資料呈現的部分,這次我們僅簡單利用RecyclerView以列表的方式來呈現資料,所以先到activity_main.xml裡去新增RecyclerView。
再來接著處理,RecyclerView裡面的item_recycler.xml。在這裡我們會同時採用DataBinding的技術,如此一來資料就會自動對應到Model裡的屬性。要使用DataBinding時,layout的最外層必須是<layout>,而裡面需要含有一個<data>的區塊。
再來我們就可以開始設計畫面,然後在需要綁定資料的地方以@{`場站名稱: ` + item.sna}
的方式來綁定,所以最後應該會長成這樣:
接著我們開始著手處理RecyclerView的Adapter,因為使用DataBinding所以在ViewHolder裡接收的不是View而是ViewDataBinding,而在onBindViewHolder裡則是直接把資料的類別傳給View,所以我們的Adapter便會是這樣
剩下的事情就簡單了,我們只需要把RecyclerView設定好,把LiveData的觀察設定好,然後觸發startRetrieveData讓他開始自動去抓取資料即可。我們分別利用initView及initData兩個函式來處理前兩件事。
最後我們在onCreate的最後面呼叫model.startRetrieveData()
來開始抓取資料,以下是整個MainActivity的程式:
這時候執行App應該就可以看到資料跑出來了,並且每30秒會刷新一次。