初识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代码风格写的,假如有什么地方不合适的,希望斧正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速实现Android多级树形列表,这个库是在鸿洋多级树形列表demo修改而来。解决的问题:支持ID为int类型和String类型。支持多级复选框选,使用只需一行代码。支持动态更新数据并保持原有展开/关闭状态。支持ListView、RecyclerView。USE我们关联列表树需要有三个必须元素,当前id、父级id即pid,显示的内容。id和pid可以为int或者String以及其他类型。要显示的内容需要包装一下://id pid name  FileNode为实际用的实体Bean对象 mlist.add(new Node("223","0","我也是添加的root节点",new FileNode()));对于ListView,需要继承自TreeListViewAdapter,如:public class SimpleTreeAdapter extends TreeListViewAdapter {     public SimpleTreeAdapter(ListView mTree, Context context, List datas, int defaultExpandLevel, int iconExpand, int iconNoExpand) {         super(mTree, context, datas, defaultExpandLevel, iconExpand, iconNoExpand);     }     public SimpleTreeAdapter(ListView mTree, Context context, List datas,                              int defaultExpandLevel) {         super(mTree, context, datas, defaultExpandLevel);     }     @Override     public View getConvertView(final Node node , int position, View convertView, ViewGroup parent)     {        final ViewHolder viewHolder ;         if (convertView == null) {             convertView = mInflater.inflate(R.layout.list_item, parent, false);             viewHolder = new ViewHolder();             viewHolder.cb = (CheckBox) convertView                     .findViewById(R.id.cb_select_tree);             viewHolder.label = (TextView) convertView                     .findViewById(R.id.id_treenode_label);             viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon);             convertView.setTag(viewHolder);         } else {             viewHolder = (ViewHolder) convertView.getTag();         }         viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 setChecked(node,viewHolder.cb.isChecked());             }         });         if (node.isChecked()){             viewHolder.cb.setChecked(true);         }else {             viewHolder.cb.setChecked(false);         }         if (node.getIcon() == -1) {             viewHolder.icon.setVisibility(View.INVISIBLE);         } else {             viewHolder.icon.setVisibility(View.VISIBLE);             viewHolder.icon.setImageResource(node.getIcon());         }         viewHolder.label.setText(node.getName());         return convertView;     }     private final class ViewHolder     {         ImageView icon;         CheckBox cb;         TextView label;     } }对于RecyclerView,需继承自TreeRecyclerAdapter,如:public class SimpleTreeRecyclerAdapter extends TreeRecyclerAdapter {     public SimpleTreeRecyclerAdapter(RecyclerView mTree, Context context, List datas, int defaultExpandLevel, int iconExpand, int iconNoExpand) {         super(mTree, context, datas, defaultExpandLevel, iconExpand, iconNoExpand);     }     public SimpleTreeRecyclerAdapter(RecyclerView mTree, Context context, List datas, int defaultExpandLevel) {         super(mTree, context, datas, defaultExpandLevel);     }     @Override     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {         return new MyHoder(View.inflate(mContext, R.layout.list_item,null));     }     @Override     public void onBindViewHolder(final Node node, RecyclerView.ViewHolder holder, int position) {         final MyHoder viewHolder = (MyHoder) holder;         //todo do something         viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 setChecked(node,viewHolder.cb.isChecked());             }         });         if (node.isChecked()){             viewHolder.cb.setChecked(true);         }else {             viewHolder.cb.setChecked(false);         }         if (node.getIcon() == -1) {             viewHolder.icon.setVisibility(View.INVISIBLE);         } else {             viewHolder.icon.setVisibility(View.VISIBLE);             viewHolder.icon.setImageResource(node.getIcon());         }         viewHolder.label.setText(node.getName());     }     class MyHoder extends RecyclerView.ViewHolder{         public CheckBox cb;         public TextView label;         public ImageView icon;         public MyHoder(View itemView) {             super(itemView);             cb = (CheckBox) itemView                     .findViewById(R.id.cb_select_tree);             label = (TextView) itemView                     .findViewById(R.id.id_treenode_label);             icon = (ImageView) itemView.findViewById(R.id.icon);         }     } }初始化: ListView://第一个参数  ListView //第二个参数  上下文 //第三个参数  数据集 //第四个参数  默认展开层级数 0为不展开 //第五个参数  展开的图标 //第六个参数  闭合的图标 mAdapter = new SimpleTreeAdapter(mTree, ListViewActivity.this,                         mDatas, 1,R.mipmap.tree_ex,R.mipmap.tree_ec); mTree.setAdapter(mAdapter);RecyclerView://第一个参数  RecyclerView //第二个参数  上下文 //第三个参数  数据集 //第四个参数  默认展开层级数 0为不展开 //第五个参数  展开的图标 //第六个参数  闭合的图标 mAdapter = new SimpleTreeRecyclerAdapter(mTree, RecyclerViewActivity.this,                 mDatas, 1,R.mipmap.tree_ex,R.mipmap.tree_ec); mTree.setAdapter(mAdapter);添加数据,可以保持原有选或者展开状态:List mlist = new ArrayList(); mlist.add(new Node("223","0","我也是添加的root节点",new FileNode())); mAdapter.addData(0,mlist);获取选内容:如果node的isChecked()为true,即为选状态。StringBuilder sb = new StringBuilder(); //获取排序过的nodes //如果不需要刻意直接用 mDatas既可 final List allNodes = mAdapter.getAllNodes(); for (int i = 0; i < allNodes.size(); i ) {    if (allNodes.get(i).isChecked()){        sb.append(allNodes.get(i).getName() ",");    } } String strNodesName = sb.toString(); if (!TextUtils.isEmpty(strNodesName))    Toast.makeText(this, strNodesName.substring(0, strNodesName.length()-1),Toast.LENGTH_SHORT).show();控制父子之间联动的选与取消状态,只需调用setChecked方法既可,注意如果在setOnCheckedChangeListener处理会有问题:因为如果要子节点/父节点选或者取消需要刷新页面,而刷新页面又会触发viewHolder.cb.setChecked(true/false);的判断从而又会进入setOnCheckedChangeListener,会导致如果父节点选某些子节点取消不了的情况。//viewHolder.cb 为CheckBox  viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 setChecked(node,viewHolder.cb.isChecked());             }         });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值