使用Kotlin的Android ListView

时间:2020-02-23 14:29:02  来源:igfitidea点击:

在本教程中,我们将使用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>