鱼C论坛

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

[技术交流] kotlin for android 之 复杂的listview写法,与页面美化

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

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

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

x
        你如果想在listview里表现更多的东西,比如图片,多几个标题跟文字的话就要用到以下这种方法。修改昨天的项目,在layout目录下新建data_item.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="horizontal">

  6.     <ImageView
  7.         android:layout_width="wrap_content"
  8.         android:layout_height="wrap_content"
  9.         android:src="@mipmap/ic_launcher"
  10.         android:layout_marginLeft="10dp"/>
  11.     <LinearLayout
  12.         android:layout_width="wrap_content"
  13.         android:layout_height="wrap_content"
  14.         android:orientation="vertical"
  15.         android:layout_marginLeft="10dp"
  16.         android:background="@drawable/background">
  17.         <TextView
  18.             android:id="@+id/idtext1"
  19.             android:layout_width="wrap_content"
  20.             android:layout_height="wrap_content"
  21.             android:text="aaaaaaaaaaaaaaa"
  22.             android:layout_marginBottom="10dp"
  23.             android:textSize="20sp"
  24.             android:textStyle="bold"/>
  25.         <TextView
  26.             android:id="@+id/idtext2"
  27.             android:layout_width="wrap_content"
  28.             android:layout_height="wrap_content"
  29.             android:text="bbbbbbbbbbbbbbbbbb"
  30.             android:fontFamily="cursive" />
  31.     </LinearLayout>

  32. </LinearLayout>
复制代码

        这里我给第二个linearlayout设置了个自定义的背景色,所以还要在drawable目录下创建个background.xml文件:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item>
  4.     <shape>
  5.         <solid android:color="#D3FF93" />
  6.         <corners android:radius="10dp"/>
  7.         <gradient android:startColor="#D3FF93"/>
  8.     </shape>
  9. </item>
  10. </selector>
复制代码

        在这里定义了背景的颜色,边角,渐变,这种xml方式使用起来非常方便。然后我们在MainActivity.kt旁边新建个makeAdapter.kt的文件,在这个文件里我们给listview自定义一个adapter,而不用系统给的ArrayAdapter了,代码为:
  1. package com.example.xinwei.httpproject

  2. import android.content.Context
  3. import android.view.LayoutInflater
  4. import android.view.View
  5. import android.view.ViewGroup
  6. import android.widget.BaseAdapter
  7. import android.widget.TextView

  8. data class InternetData(val title:String,val data:String)

  9. var dataArray=ArrayList<InternetData>()

  10. class InternetDataAdapter(val context:Context, val dataArray:ArrayList<InternetData>):BaseAdapter() {
  11.     override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
  12.         var internetData=dataArray[p0]
  13.         var view:View?
  14.         if (p1==null){
  15.             view=LayoutInflater.from(context).inflate(R.layout.data_item,p2,false)
  16.         }else{
  17.             view=p1
  18.         }
  19.         var title=view!!.findViewById<View>(R.id.idtext1) as TextView
  20.         var data=view!!.findViewById<View>(R.id.idtext2) as TextView
  21.         title.text=internetData.title
  22.         data.text=internetData.data
  23.         return view
  24.     }

  25.     override fun getItem(p0: Int): Any {
  26.         return dataArray[p0]
  27.     }

  28.     override fun getItemId(p0: Int): Long {
  29.         return p0.toLong()
  30.     }

  31.     override fun getCount(): Int {
  32.         return dataArray.size
  33.     }
  34. }
复制代码

        第一行是一个数据类,因为是复杂数据,最好的方式是把数据打包成数据类再把这个类的多个对象放进一个数组里,以便于使用。所以在底下又新建了个数组。在我们自定义的adapter里复写了继承自BaseAdapter的4个方法,分别作用是:获取布局文件然后把数据放进去,获取每一项数组里数据,获取数组里每一项的id,获取数组长度。最后还要修改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.             data.map {
  63.                 dataArray.add(InternetData("title",it))
  64.             }
  65.             idlist.adapter=InternetDataAdapter(context, dataArray)
  66.         }

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

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

  85.                 return str.joinToString(" ")
  86.             }catch (e:Exception){
  87.                 e.printStackTrace()
  88.             }
  89.             return ""
  90.         }
  91.     }
  92. }
复制代码

        在这里主要是给数组初始化,和把我们新建的adapter赋值给listview。效果图为:
jdfw.gif

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
qingchen + 5 + 5 楼主,你学kotlin是看什么书?

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 17:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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