用 Kotlin 创建 Android BaseAdapter

在 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

// items 的类型,应当根据实际情况而定,由于这只是一个简单的 demo,故意设定成 String
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

// 需要创建视图 animals_list
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
<!– 当然,你使用 ListView 也可以 –>
<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 –>
<Button
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_height=”match_parent”
android:layout_width=”match_parent” android:id=”@+id/name”/>

运行效果:

参考

You May Also Like

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注