今天要回到先前的app用上一次的方法將資料存入spinner中。
這邊先貼上我下載的xml文件結構,在ROOT下有很多的RECORD而RECORD下又有我們所需要的資料,資料的部分打算只取得名稱、地址、鄉鎮市區、東經、北緯。
<ROOT>
<RECORD></RECORD>
<RECORD></RECORD>
<RECORD></RECORD>
<RECORD></RECORD>.....
</ROOT>
<ROOT>
<RECORD>
<景點ID></景點ID>
<狀態></狀態>
<名稱></名稱>
<簡述></簡述>
<介紹></介紹>
<鄉鎮市區></鄉鎮市區>
<地址></地址>
<東經></東經>
<北緯></北緯>
<電話></電話>
<大眾運輸></大眾運輸>
<門票資訊></門票資訊>
<行車資訊></行車資訊>
<停車資訊></停車資訊>
<旅遊叮嚀></旅遊叮嚀>
</RECORD>
</ROOT>
首先來做Getter、Setter的部分,在java中一般會是這個樣子,這邊只顯示name的部分。
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
在kotlin中可能會是這個樣子,簡潔了許多。
class Tour{
var name: String? = null
var addr: String? = null
var area: String? = null
var eastL: String? = null
var northL: String? = null
}
第一步先來做宣告的部分,一個tour可以想像成是一個RECORD而我們有很多的RECORD所以要用一個arraylist將所有tour合併成tours,而tours便可以想像成是一個ROOT,最後的nameList是只取得name的部分。
//旅遊資料
private lateinit var tours: ArrayList<Tour>
private lateinit var tour: Tour
private lateinit var nameList: ArrayList<String>
取得資料的部分,可以在節點-名稱中看到將name存入nameList的部分。
//xml資料
fun getAssetsStream() {
try {
val tourData: InputStream = activity!!.assets.open("tour.xml")
val xmlPullParser = Xml.newPullParser()
tour = Tour()
tours = ArrayList()
nameList = ArrayList()
nameList.add("請選擇旅遊地點")
//xml解析器
xmlPullParser.setInput(tourData, "utf-8")
//取得xml節點
var eventType = xmlPullParser.eventType
//讀取xml資料
while (eventType != XmlPullParser.END_DOCUMENT) {
when (eventType) {
//開始讀檔案
XmlPullParser.START_DOCUMENT -> tours
//xml找到的節點儲存到list
XmlPullParser.START_TAG -> if (xmlPullParser.name == "RECORD") {
//節點-名稱
} else if (xmlPullParser.name == "名稱") {
val name = xmlPullParser.nextText()
tour.name = name
nameList.add(name)
//Log.e("tour name", "tour name: ${tour.name}")
//節點-區域
} else if (xmlPullParser.name == "鄉鎮市區") {
val area = xmlPullParser.nextText()
tour.area = area
//Log.e("tour area", "tour area: ${tour.area}")
//節點-地址
} else if (xmlPullParser.name == "地址") {
val addr = xmlPullParser.nextText()
tour.addr = addr
//Log.e("tour name", "tour name: ${tour.addr}")
//節點-經度
} else if (xmlPullParser.name == "東經") {
val eastL = xmlPullParser.nextText()
tour.eastL = eastL
//Log.e("tour name", "tour name: ${tour.eastL}")
//節點-緯度
} else if (xmlPullParser.name == "北緯") {
val northL = xmlPullParser.nextText()
tour.northL = northL
//Log.e("tour name", "tour name: ${tour.northL}")
}
//節點結束
XmlPullParser.END_TAG -> if (xmlPullParser.name == "RECORD") {
tours.add(tour)
tour = Tour()
}
}
//下一個xml節點
eventType = xmlPullParser.next()
}
tourData.close()
} catch (e: Exception) {
e.printStackTrace()
}
//輸出內容
for (i in 0 until tours.size) {
Log.e("tour ", "tour $i xml : ${tours[i].name}")
}
}
接下來到onViewCreated將資料存到spinner中,R.layout.spinner_item的部分要在res->layout下新增。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val spinnerList: ArrayAdapter<String> = ArrayAdapter(context!!, R.layout.spinner_item, nameList)
tour_spinner.adapter = spinnerList
}
spinner_item:
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#215968"
android:textSize="18sp"
android:padding="5dip"
/>
到這邊便能夠成功將資料顯示到下拉式選單中,明天要來做選擇後的動作。