初识kotlin,实现一个简单的列表__implements的博客-程序员宝宝_android用kt实现列表

技术标签: Kotlin  


开场小絮叨:


kotlin被谷歌正式作为Android的一级开发语言已经好几个月了,一直想学习一下,一直没有时间(好吧,我承认是我懒)。最近买了本书啃,也算下定决心学习这门语言。学习新知识,首先你要知道它是什么它的历史和它的用途。它是针对Java平台的一种编程语言,在这我强调一下,kotlin并不是一门新的语言,它其实在11年就已经推出来了,只不过是在被谷歌认证为Android开发官方语言之后才被人们广泛流传。当然,也不要简单的认为它只能用来开发Android应用,它还可以用来开发服务端和其它的用武之地。对于这门语言,我只能说很强大,但是不会盲目追捧(好多文章已经把它捧上天了),适合自己的才是最好的。


学习一门语言,光看是不行的,还是得动手啊,毕竟实践是检验理论的唯一标准。作为程序员学习新语言的第一个程序都是hello world,但是你会感到兴奋吗,不会,因为这一步骤大多数IDE都会自动生成,其实和没写是一样的。所以今天我打算来实现一个简单的列表来体验一下kotlin。怎么配置环境我就不多说了,要么下载插件,要么下载最新版本的Android Studio。

首先我们先明确一下步骤

1.编写布局文件(很简单就一个ListView)

2.编写数据类(在这里我就用最常用的Person类吧 哈哈)

3.编写适配器

4.在Activity里面做一下处理(这里就简单的给ListView设置适配器和点击事件)

布局文件这和我们平常没什么区别就略过了,那么就从编写数据类开始吧

Person.kt

package com.demo.bean

class Person(name:String,age:Int,profile:String="这个人很懒还没有签名"){
    var name:String=""
    var age:Int=0
    var profile:String?=null
    init {
        this.name=name
        this.age=age
        this.profile=profile
    }
}

看到上面的和平常我们java写的数据类相比是不是简洁了好多,这是因为kotlin内部自己实现了默认的getter和setter,在通过对象访问属性的适合会默认调用getter和setter,当然我们也可以自定义,这里就不说了。接下来是适配器部分

BasicAdapter.kt(抽取出来的一个抽象类)

package com.demo.adapter
import android.content.Context
import android.widget.BaseAdapter
abstract class BasicAdapter<T>(context: Context?,list:ArrayList<T>?): BaseAdapter() {
    var listData:ArrayList<T>?=null
    var context:Context?=null
    init {
        this.listData=list
        this.context=context
    }
    override fun getItem(p0: Int): T? {
        return listData?.get(p0)
    }

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

    override fun getCount(): Int {
        return listData?.size?:0
    }

    /**
     * 获取数据集合
     */
    public fun getData():ArrayList<T>?{
        return listData
    }

    /**
     * 移除某一项
     */
    public fun remove(position:Int){
        listData?.removeAt(position)
        notifyDataSetChanged()
    }

    /**
     * 移除所有数据
     */
    public fun removeAll(){
        listData?.clear()
        notifyDataSetChanged()
    }

    /**
     * 在某一个位置更新数据
     */
    public fun update(postion:Int,data:T){
        listData?.add(postion,data)
        notifyDataSetChanged()
    }

    /**
     * 追加数据
     */
    public fun updateAllAppend(datas:ArrayList<T>){
        listData?.addAll(datas)
        notifyDataSetChanged()
    }

    /**
     * 更新全部数据
     */
    public fun updateAll(datas: ArrayList<T>){
        listData?.clear()
        listData?.addAll(datas)
        notifyDataSetChanged()
    }
}

MyAdapter.kt(具体实现类)
package com.demo.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.demo.bean.Person
import com.zhangs.demo.firstkotlin.R

class MyAdapter(context: Context?, list: ArrayList<Person>?) : BasicAdapter<Person>(context, list) {
    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        var contentview = p1
        var holder: MyAdapter.ViewHolder? = null
        if (contentview == null) {
            contentview = LayoutInflater.from(context).inflate(R.layout.layout_item_list, null)
            var tv_userName: TextView = contentview.findViewById(R.id.tv_username)
            var tv_age: TextView = contentview.findViewById(R.id.tv_age)
            var tv_profile: TextView = contentview.findViewById(R.id.tv_profile)
            holder = MyAdapter.ViewHolder(tv_userName, tv_age, tv_profile)
            contentview.setTag(holder)
        } else {
            holder = contentview.getTag() as MyAdapter.ViewHolder?
        }
        holder?.userName?.setText(listData?.get(p0)?.name)
        holder?.age?.setText(listData?.get(p0)?.age.toString())
        holder?.profile?.setText(listData?.get(p0)?.profile)
        return contentview!!
    }
}



语法可能看着有点陌生,但是我相信你肯定能看懂,这不就是原来我们一直重复写过的listview优化部分吗

接下来我们就在Acitivity里面稍微处理一下,让页面显示出一个列表吧

MainActivity.kt

package com.demo.kotlin

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.ListView
import android.widget.Toast
import com.demo.adapter.MyAdapter
import com.demo.bean.Person
import com.zhangs.demo.firstkotlin.R

class MainActivity : AppCompatActivity() {
    var mListView: ListView? = null
    var data: ArrayList<Person>? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mListView=findViewById(R.id.listview)
        initData()
        var adater= MyAdapter(this,data);
        mListView?.adapter=adater
        //设置item的点击事件
       mListView?.setOnItemClickListener { adapterView, view, i, l -> Toast.makeText(this,data?.get(i)?.name,Toast.LENGTH_SHORT).show() }
    }

    /**
     * 初始化数据
     */
    public fun initData(): Unit {
        data = arrayListOf(Person("张三", 21, "哈哈哈哈哈"), Person("李四", 21, "嘻嘻嘻嘻嘻嘻嘻"), Person("王五", 21), Person("赵六", 21, "嘿嘿嘿嘿嘿嘿嘿嘿嘿"), Person("张三疯", 21, "哈哈哈哈哈"), Person("张三四", 21, "哈哈哈哈哈"))
    }

}

那么我们就来运行一下吧,效果如下:



当然运行出效果不是最重要的,主要是通过这个简单的例子,来体验一下,kotlin和java的区别,当然我这个例子完全是按java代码风格写的,假如有什么地方不合适的,希望斧正。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013320868/article/details/78042223

智能推荐

Spring官网下载各版本jar包_木子木泗的博客-程序员宝宝_spring的jar包下载

source:&amp;nbsp;http://blog.csdn.net/yuexianchang/article/details/535833271:浏览器输入官网地址:http://spring.io/projects2:点击如图树叶页面按钮。&amp;nbsp;3:点击如图小猫图片按钮。&amp;nbsp;4:查找downloading&amp;nbsp;spring&amp;nbsp;artifact...

Git命令(超详细)[email protected]张的博客-程序员宝宝

内容转载于:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html工作中经常使用 Git ,但是很多命令记不住,每次忘了总去百度查,于是自己直接转载过来。Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库# 在当前目录新建一个G...

【HAL】Framework入口函数简介(1):set_callbacks_j衣l日的博客-程序员宝宝

提供指向HAL模块的回调函数指针,以将异步相机模块事件通知到框架。在初始的camera HAL模块加载之后,在get_number_of_cameras()方法第一次被调用之后,以及在任何其他模块调用之前,框架都会调用这个函数。函数及结构体typedef struct camera_module_callbacks { void (*camera_device_status_change)(const struct camera_module_callbacks*, .

Java亿级流量高并发设计解决方案 之 分布式网络编程核心-远程调用_匿名王同学的博客-程序员宝宝_远程调用的并发模式

当单服务器的负载超限时,通常会搭建集群服务或将系统拆分成分布式的结构。本章将讲解如何在多台服务器之间实现远程通信。1.OSI与TCP/IP网络模型1.1OSI七层模型物理层:用于原始信号(0,1)的传输。单位是比特。设备是中继器,集线器。数据链路层:通过MAC地址(全球唯一)在网络中定位目标计算机的位置,从而实现一个子网内的通信。传输的单位是Frame(帧)。主要设备是网卡,网桥,交换机。网络层:若多个设备在同一子网内,则通过数据链路层即可通信。若不在一个子网内,则需要通过网络层通信。网络层会在

neutron组件_网络组件Neutron_cusi77914的博客-程序员宝宝

本文介绍了OpenStack网络,该网络管理其他OpenStack项目之间的连接。 在不包含任何特定于网络的功能的情况下,有可能开发出一种可弹性伸缩的工作负载管理系统。 当然,计算节点将需要它们之间的连接性以及对外界的访问,但是有可能利用现有的网络基础结构来分配IP地址并在节点之间中继数据。 在多租户环境中,这种方法的最大问题在于,现有的网络管理系统将无法高效,安全地隔离用户之间的流量,这...

随便推点

内存编址和关于按字寻址和按字节寻址的理解_weixin_34348174的博客-程序员宝宝

我们先从一道简单的问题说起! 设有一个1MB容量的存储器,字长32位,问:按字节编址,字编址的寻址范围以及各自的寻址范围大小? 如果按字节编址,则 1MB = 2^20B 1字节=1B=8bit 2^20B/1B = 2^20 ...

vue使用sass指定版本安装附上node-sass 和sass-loader 有版本对应的关系(亲测可行本人node版本10.22.1)_calmtho的博客-程序员宝宝_npm i -d sass

先展示一下使用环境:相关的指令:node -vnpm -vwebpack -vnode-sass -v 查看是否有已经安装的sass版本:卸载指令:npm uninstall --save node-sass执行安装sass相关的语句:npm i -D [email protected] i -D [email protected]安装后使用要在build/webpack.base.conf.js里添加配置:(注意逗号){test: /\.scss$/,loade

redis3.0 集群实战2 - 集群功能实战_weixin_30265171的博客-程序员宝宝

1 集群基本操作1.1 查看当前集群状态使用redis-trib.rb check功能查看对应的节点的状态:[[email protected] bin]# ./redis-trib.rb check 127.0.0.1:7000Connecting to node 127.0.0.1:7000: OKConnecting to node 127.0.0.1:7002: OKC...

Wincc安装教程+破解教程(包括软件下载链接——百度网盘)_紫冰寒寞的博客-程序员宝宝_wincc

1、计算机——右击——管理——用户——确定当前用户是内置的Administrator,并把它的禁用解除;2、控制面板——程序——打开或关闭Windows功能——勾选Microsoft Message Queue(MSMQ)服务器;3、双击程序进行安装;安装问题:Please restart Windows before installing new programs开始——运行——

VsCode jquery代码提示插件安装方法_小猫咪咪2E的博客-程序员宝宝_vscode jquery插件

VsCode jquery代码提示插件安装方法插件下载地址:http://en.ucbw123.com/jquerysnippets/5685安装步骤:打开VsCode,使用Ctrl+P,输入 ext install jquery code snippets ,搜索要安装的插件,点击安装按钮即可。

aes算法 java_AES算法Java实现浅析_羊迪的博客-程序员宝宝

下载后解压文件,将里面的文件拷贝到/lib/security [Unix]/lib/security [Win32]覆盖原先的jar文件,请先备份原先的jar文件,以防你需要恢复密钥长度的限制,这里需要注意的是如果是安装的jdk,jdk目录中的jre下面的lib/security下的文件也需要覆盖。完成这个步骤之后就可以使用不限制密钥长度的aes算法了,简...