使用Kotlin的Android ListView
在本教程中,我们将使用Kotlin在Android应用中实现ListView。
什么是Android ListView?
ListView是Android应用程序中非常常见的UI元素。
它用于显示由分隔符分隔的项目列表,可以无限滚动。
通常用于显示一组相关项目。
ListView XML布局
<ListView android:id="@+id/recipe_list_view" android:layout_width="match_parent" android:layout_height="wrap_content
ListView XML属性
android:divider:在列表项之间绘制的可绘制或者彩色。
android:divider:在列表项之间绘制的可绘制或者彩色。
android:dividerHeight:分隔线的高度。
android:entries:可以在此处传递数组资源以显示为列表。
android:footerDividersEnabled:设置为false时,ListView的末尾没有分隔符。
android:headerDividersEnabled:设置为false时,ListView的顶部没有分隔符
android:clickable:使ListView行可点击。
如果您是通过Activity设置ListView,则无需设置此属性android:listSelector:设置单击列表视图行时的背景色。
通过在strings.xml
文件中定义一个数组,我们可以在没有任何Java代码的情况下填充ListView中的条目:
<string-array name="Colors"> <item name="color">Red</item> <item name="color">Orange</item> <item name="color">Yellow</item> <item name="color">Green</item> <item name="color">Blue</item> <item name="color">White</item> <item name="color">Black</item> <item name="color">Purple</item> <item name="color">Pink</item> <item name="color">Gray</item> <item name="color">Cyan Blue</item> <item name="color">Magenta</item> </string-array>
现在,ListView在布局中填充为:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/Colors" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" </android.support.constraint.ConstraintLayout>
将宽度设置为wrap_content会将ListView行包装为其内容。
在ListView中设置选择器和分隔线颜色
使用以下ListView标记:
<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@color/colorPrimary" android:dividerHeight="1dp" android:entries="@array/Colors" android:listSelector="@android:color/holo_green_dark" android:clickable="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"
上面的代码使ListView可以选择。
但是要在每个ListView行上添加逻辑,我们需要使用适配器。
ListView适配器
ListView类本身不能填充条目。
适配器负责填充ListView中的数据。
我们有内置的适配器类(如上面的适配器类),每一行都有内置的布局。
我们也可以创建自己的定制适配器类。
适配器带有自己的一组内置方法。
以下两个是最重要的:
getView():我们可以在此方法内的Adapter中增加自己的布局。
如果数据已更改或者有新数据可用,则会调用适配器上的" notifyDataSetChanged()"方法。
为了在ListView上设置适配器,我们使用方法setAdapter()
。
ListView适配器的类型
适配器有四种主要类型:
BaseAdapter –顾名思义,此抽象被所有其他适配器扩展。
使用此方法作为父类创建自定义适配器时,您需要覆盖上述所有方法以及getCount(),getId()等。ArrayAdapter –使用提供的数组填充ListView。
它定义为:
第一个参数是上下文,其后是列表行的布局资源。
布局必须具有TextView。
第三个参数是数组。
对于ArrayAdapter,您只需要重写getView()
方法即可。
由于ArrayAdapter自行计算数组的大小,因此不需要getCount()。
ListAdapter –与ArrayAdapter不同,这是一个接口。
因此,它只能与具体的适配器类一起使用。
具体的适配器类是ListActivity和ListFragment。SimpleCursorAdapter –需要从数据库填充数据时使用。
在其构造函数中,我们必须为每一行指定布局,还必须指定包含需要显示的字段的Cursor实例。
ListView Kotlin项目结构
1. XML布局代码
下面给出了" activity_main.xml"布局的代码:
var arrayAdapter = ArrayAdapter<String>(context,layout,array);
2.主要活动科特林代码
MainActivity.kt类的代码如下。
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/Colors" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" </android.support.constraint.ConstraintLayout>
在上面的代码中,我们显示一条敬酒消息。
我们通过在build.gradle
中添加Anko commons依赖项来实现该简写的Toast函数。
resources.getStringArray(R.array.Colors)将存储在资源文件中的字符串数组转换为Kotlin数组。
android.R.layout.simple_list_item_1是仅托管TextView的内置布局。
setOnItemClickListener是Kotlin函数,当单击任何ListView行时会触发该函数。
其中我们可以实现我们的逻辑。
函数内部的四个参数是:
adapterView
:进行选择的父视图。
它的ListView在这里。view
:ListView中的选定视图(行)" position":行在适配器中的位置。
这是一个Int。id:所选项目的行ID。
这是一个长。
不用使用数组检索值,我们可以通过以下方式从adapterView中获取它:
package net.androidly.androidlylistview import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.widget.ArrayAdapter import kotlinx.android.synthetic.main.activity_main.* import org.jetbrains.anko.toast class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var colorArrays = resources.getStringArray(R.array.Colors) var arrayAdapter = ArrayAdapter<string>(this, android.R.layout.simple_list_item_1, colorArrays) listView.adapter = arrayAdapter listView.setOnItemClickListener { adapterView, view, position: Int, id: Long -> toast(colorArrays[position]) } } }
getItemAtPosition返回该索引处的列表视图行。
在这种情况下,该行是TextView。
实际应用程序的输出如下:
我们可以通过在drawable文件夹内创建一个选择器drawable来更改默认项目按色。
list_selector.xml
val selectedString = adapterView.getItemAtPosition(position) as String
在ListView XML标记内添加以下属性:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/colorAccent" android:state_pressed="true" <item android:drawable="@android:color/transparent" </selector>