在 Google 宣布 Kotlin 成为 Android 的开发语言之后,Kotlin 才开始慢慢进入人民的视野。到现在为止,已经 1 年多过去了,网络上已经逐渐出现各种 Kotlin 的教程。而且,Kotlin 其灵活和简单的语法,也受到很多开发者的青睐。
然而,我个人认为,Kotlin 要完全取代 Java,未来 5 年也是不行的。Java 经过这么长时间的发展,其生态圈聚集了各行各业的精英,工具也十分完善。
但我们仍然可以学习一下这门新兴的语言,具备 Java 基础的朋友,上手 Kotlin 也是十分容易,毕竟触类旁通嘛。
今天,本文章只是简单介绍一下如何使用 Kotlin 创建一个简单的 Adapter。
环境
- MacOS 10.14
- Android Studio v3.2
- Kotlin 1.2
仓库
如想直接运行 demo 的,请前往:Base Adapter Demo 克隆,欢迎 star。
什么是 Adapter
在开发 App 时,经常要使用列表,在实际应用中,我们的列表 (ListView/GridView) 的数据不可能是静态的,往往是从某些数据源 (Data Source) 获取而来。而适配器 (Adapter),则是列表和数据源之间的纽带,它可以把数据映射到列表上面。
下图简单直观地显示出它们的关系。

Android Adapter 的类型有很多,详见:Android Adapter (需要科学上网),本文只简单介绍如何利用 BaseAdapter
来创建列表,其他类型的 Adapter 这里不一一介绍。
用 Kotlin 创建 Android BaseAdapter
本文要求你:
- 对 Android Studio 的使用有初步的了解;
- 对 Kotlin 的基础语法有一定的了解;
- 对 Android 开发有一定的了解。
在你新建了一个基于 Kotlin 的项目之后,它会默认包含一个 MainActivity
。
现在,我们通过 Android Studio 另外创建两个类:
AnimalsListActivity
AnimalsAdapter
从文件名字便可知道,AnimalsListActivity
是列表,AnimalsAdapter
是 Adapter。
首先,先完成 Adapter 的部分。
这里需要注意,继承系统的 BaseAdapter
,需要在自定义的适配器里面重写下面几个方法:
- getView
- getItem
- getItemId
- getCount
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| package com.fengzifz.animalsound
import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.TextView
class AnimalsAdapter(private var activity: Activity, private var items: List<String>) : BaseAdapter() {
private class ViewHolder(view: View?) { var name: TextView? = null
init { this.name = view?.findViewById(R.id.name) } }
@SuppressLint("InflateParams") override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val view: View? val viewHolder: ViewHolder
if (convertView == null) { val inflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater view = inflater.inflate(R.layout.animals_list, null) viewHolder = ViewHolder(view) view?.tag = viewHolder } else { view = convertView viewHolder = view.tag as ViewHolder }
viewHolder.name?.text = items[position]
return view as View }
override fun getItem(position: Int): String { return items[position] }
override fun getItemId(position: Int): Long { return position.toLong() }
override fun getCount(): Int { return items.size }
}
|
然后,是 AnimalsListActivity
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.fengzifz.animalsound
import android.os.Bundle import android.support.v7.app.AppCompatActivity; import kotlinx.android.synthetic.main.activity_animals.* import kotlinx.android.synthetic.main.content_animals.*
class AnimalsListActivity : AppCompatActivity() {
private var listData = listOf( "Dog", "Cat", "Pig", "Hen", "Fish" )
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_animals) setSupportActionBar(toolbar)
animal_list.adapter = AnimalsAdapter(this, listData)
}
}
|
最后,创建视图文件。
在主视图里面,加入:
1 2 3 4 5 6
| <GridView android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="3" android:id="@+id/animal_list"/>
|
animals_list
视图:
1 2 3 4 5 6
| <?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/name"/>
|
运行效果:

参考