iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

Android的學習歷程系列 第 10

[Day 10] Android程式設計-使用OpenData資料製作app(六)(kotlin)

今天要回到先前的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"
    />

到這邊便能夠成功將資料顯示到下拉式選單中,明天要來做選擇後的動作。


上一篇
[Day 9] Android-使用XmlPullParser取得xml資料
下一篇
[Day 11]Android程式設計-使用OpenData資料製作app(七)(kotlin)
系列文
Android的學習歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言