鱼C论坛

 找回密码
 立即注册
查看: 3477|回复: 0

[技术交流] kotlin for android 之 xml格式数据解析与简单listview的使用

[复制链接]
发表于 2017-11-29 06:29:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        我在网上找了个yahoo提供的xml数据,我也不知是干什么用的,只是方便于我们学习。如图:
asdasasdasd.png
        修改我们之前的项目,MainActivity.kt文件:
  1. package com.example.xinwei.httpproject

  2. import android.annotation.SuppressLint
  3. import android.os.AsyncTask
  4. import android.support.v7.app.AppCompatActivity
  5. import android.os.Bundle
  6. import android.util.Log
  7. import kotlinx.android.synthetic.main.activity_main.*
  8. import org.json.JSONObject
  9. import org.xmlpull.v1.XmlPullParser
  10. import org.xmlpull.v1.XmlPullParserFactory
  11. import java.io.*
  12. import java.net.HttpURLConnection
  13. import java.net.URL

  14. class MainActivity : AppCompatActivity() {

  15.     override fun onCreate(savedInstanceState: Bundle?) {
  16.         super.onCreate(savedInstanceState)
  17.         setContentView(R.layout.activity_main)
  18.         getInternetData()
  19.     }
  20.     fun getInternetData(){
  21.         val url="https://query.yahooapis.com/v1/public/yql?q=show%20tables&diagnostics=true"
  22.         val myAsyncTask=MyAsyncTask()
  23.         myAsyncTask.execute(url)
  24.     }
  25.     @SuppressLint("StaticFieldLeak")
  26.     inner class MyAsyncTask : AsyncTask<String, String, String>() {

  27.         override fun onProgressUpdate(vararg values: String?) {
  28.             super.onProgressUpdate(*values)
  29.         }

  30.         override fun doInBackground(vararg p0: String?):String {
  31.             try {
  32.                 val url=URL(p0[0])
  33.                 val urlConnect=url.openConnection() as HttpURLConnection
  34.                 urlConnect.connectTimeout=7000
  35.                 urlConnect.requestMethod="GET"
  36.                 urlConnect.readTimeout=7000
  37.                 var inString=convertToString(urlConnect.inputStream)
  38.                 var parsedData=parseXML(inString)
  39.                 publishProgress(parsedData)
  40.                 urlConnect.disconnect()
  41.                 return parsedData
  42.             }catch (e:Exception){
  43.                 e.printStackTrace()
  44.             }
  45.             return "网站连接失败"
  46.         }

  47.         private fun convertToString(inputStream: InputStream?): String {
  48.             var bufferedReader=BufferedReader(InputStreamReader(inputStream))
  49.             var allString=StringBuilder()
  50.             bufferedReader.forEachLine {
  51.                 allString.append(it)
  52.             }
  53.             bufferedReader.close()
  54.             inputStream?.close()
  55.             return allString.toString()
  56.         }

  57.         override fun onPostExecute(result: String?) {
  58.             super.onPostExecute(result)
  59.             idtext.text=result
  60.         }

  61.         private fun parseXML(result: String): String {

  62.             try {
  63.                 var factory=XmlPullParserFactory.newInstance()
  64.                 var xmlParser=factory.newPullParser()
  65.                 xmlParser.setInput(StringReader(result))
  66.                 var eventType=xmlParser.eventType
  67.                 var str= ArrayList<String>()
  68.                 while (eventType!=XmlPullParser.END_DOCUMENT){
  69.                     var nodeName=xmlParser.name
  70.                     when(eventType){
  71.                         XmlPullParser.START_TAG->{
  72.                             if ("table".equals(nodeName)){
  73.                                 str.add(xmlParser.nextText())
  74.                             }
  75.                         }
  76.                     }
  77.                     eventType=xmlParser.next()
  78.                 }

  79.                 return str.joinToString(" ")
  80.             }catch (e:Exception){
  81.                 e.printStackTrace()
  82.             }
  83.             return ""
  84.         }
  85.     }
  86. }
复制代码

        我在doInBackground里调用了我写的parseXML这个方法,来解析xml格式,为了省事我把进度条去掉了。这是解析完的效果图:
dsfdsdfd.png
        这里每条数据看起来很乱,我们给加个listview,就是列表就好了,修改activity_main.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context="com.example.xinwei.httpproject.MainActivity">

  8.     <ListView
  9.         android:id="@+id/idlist"
  10.         android:layout_width="wrap_content"
  11.         android:layout_height="wrap_content" />


  12. </LinearLayout>
复制代码

修改MainActivity.kt文件:
  1. package com.example.xinwei.httpproject

  2. import android.annotation.SuppressLint
  3. import android.content.Context
  4. import android.os.AsyncTask
  5. import android.support.v7.app.AppCompatActivity
  6. import android.os.Bundle
  7. import android.util.Log
  8. import android.widget.ArrayAdapter
  9. import kotlinx.android.synthetic.main.activity_main.*
  10. import org.json.JSONObject
  11. import org.xmlpull.v1.XmlPullParser
  12. import org.xmlpull.v1.XmlPullParserFactory
  13. import java.io.*
  14. import java.net.HttpURLConnection
  15. import java.net.URL

  16. class MainActivity : AppCompatActivity() {

  17.     override fun onCreate(savedInstanceState: Bundle?) {
  18.         super.onCreate(savedInstanceState)
  19.         setContentView(R.layout.activity_main)
  20.         getInternetData()
  21.     }
  22.     fun getInternetData(){
  23.         val url="https://query.yahooapis.com/v1/public/yql?q=show%20tables&diagnostics=true"
  24.         val myAsyncTask=MyAsyncTask(this)
  25.         myAsyncTask.execute(url)
  26.     }
  27.     @SuppressLint("StaticFieldLeak")
  28.     inner class MyAsyncTask(val context:Context) : AsyncTask<String, String, String>() {

  29.         override fun onProgressUpdate(vararg values: String?) {
  30.             super.onProgressUpdate(*values)
  31.         }

  32.         override fun doInBackground(vararg p0: String?):String {
  33.             try {
  34.                 val url=URL(p0[0])
  35.                 val urlConnect=url.openConnection() as HttpURLConnection
  36.                 urlConnect.connectTimeout=7000
  37.                 urlConnect.requestMethod="GET"
  38.                 urlConnect.readTimeout=7000
  39.                 var inString=convertToString(urlConnect.inputStream)
  40.                 var parsedData=parseXML(inString)
  41.                 publishProgress(parsedData)
  42.                 urlConnect.disconnect()
  43.                 return parsedData
  44.             }catch (e:Exception){
  45.                 e.printStackTrace()
  46.             }
  47.             return "网站连接失败"
  48.         }

  49.         private fun convertToString(inputStream: InputStream?): String {
  50.             var bufferedReader=BufferedReader(InputStreamReader(inputStream))
  51.             var allString=StringBuilder()
  52.             bufferedReader.forEachLine {
  53.                 allString.append(it)
  54.             }
  55.             bufferedReader.close()
  56.             inputStream?.close()
  57.             return allString.toString()
  58.         }

  59.         override fun onPostExecute(result: String?) {
  60.             super.onPostExecute(result)
  61.             var data=result!!.split(" ")
  62.             idlist.adapter=ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,data)
  63.         }

  64.         private fun parseXML(result: String): String {

  65.             try {
  66.                 var factory=XmlPullParserFactory.newInstance()
  67.                 var xmlParser=factory.newPullParser()
  68.                 xmlParser.setInput(StringReader(result))
  69.                 var eventType=xmlParser.eventType
  70.                 var str= ArrayList<String>()
  71.                 while (eventType!=XmlPullParser.END_DOCUMENT){
  72.                     var nodeName=xmlParser.name
  73.                     when(eventType){
  74.                         XmlPullParser.START_TAG->{
  75.                             if ("table".equals(nodeName)){
  76.                                 str.add(xmlParser.nextText())
  77.                             }
  78.                         }
  79.                     }
  80.                     eventType=xmlParser.next()
  81.                 }

  82.                 return str.joinToString(" ")
  83.             }catch (e:Exception){
  84.                 e.printStackTrace()
  85.             }
  86.             return ""
  87.         }
  88.     }
  89. }
复制代码

        我给MyAsyncTask构造器传了个上下文context,这是必须有的,然后就使用了一句话就做好了listview列表idlist.adapter=ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,data),效果图如下:
jdfw.gif
        

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 07:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表