Android开发学习笔记——ListView、GridView和RecycleView


在Android开发的过程中,由于手机屏幕大小是有限的,其能够显示的内容也是有限的,因此我们往往需要使用可滚动的控件来批量展示数据集合,在Android开发中,我们就常用List View、GridView和RecycleView来展示。

ListView

ListView是我们在开发过程中最常用的一个控件之一,顾名思义,ListView是一个列表组件,可以用于批量展示一个数据集合,并以列表的形式显示出来。
ListView的常用属性:

属性 含义
android:choiceMode 设置ListView的选择行为
android:divider 设置ListView的分割线
android:dividerHeight 设置分割线的高度
android:entries 指定一个数组资源
android:footerDividersEnabled 是否在footerview之前绘制分割线
android:headerDividersEnabled 是否在headererview之前绘制分割线

ListView基本用法

简单用法

任何ListView的实现都可以将其概括成四个部分:

  • 在布局中添加ListView:用于显示列表
  • 创建ListView中item的布局:用于显示列表表项
  • 创建ListView的Adapter:ListView是通过Adapter为其提供数据的,Android提供了多个Adapter实现类,如ArrayAdapter、SimpleAdapter等
  • 获取列表数据:ListView的展示内容,一般会根据显示内容创建对应的实体类,根据应用场景从服务端获取或是从数据库等渠道获取

ListView最简单的用法如下:
首先在布局中添加ListView组件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".list.ListViewActivity">
    <ListView
        android:id="@+id/lvSimple"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

在Activity中为ListView提供adapter,item布局和列表数据,并为子项添加点击事件:

class ListViewActivity : AppCompatActivity() {
   

    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list_view)

        //提供列表数据
        val arr = arrayOfNulls<String>(20)
        for (i in 1..20) arr[i-1] = "item$i"
        //创建adapter,使用Android提供的R.layout.simple_list_item_1作为item的布局
        val arrayAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arr)
        lvSimple.adapter = arrayAdapter
        //设置item的点击事件
        lvSimple.setOnItemClickListener{
    adapterView : AdapterView<*>, view1: View, i: Int, l: Long ->
            Toast.makeText(this, "item${
     i+1}", Toast.LENGTH_SHORT).show()
        }
    }
}

在这里,ListView的数据源为一个简单的String数组,使用了Android提供的ArrayAdapter作为ListView的adapter,ArrayAdapter可用来绑定简单单一的数据,并使用Android提供的R.layout.simple_list_item_1作为子项的布局。通过setOnItemClickListener可以为列表子项提供点击事件。具体实现效果如下图:
ListView简单实现

自定义item和Adapter

通过Android提供的Adapter我们可以很简单地创建出一个简单的列表,但是一旦item中的元素复杂起来,需求多了起来,那么ArrayAdapter和SimpleAdapter等就无法轻易满足开发需求,此时,我们就需要去自定义item的实现了,主要包括以下几步:

  1. 自定义item布局
  2. 根据item所需数据创建自定义实体数据类
  3. 自定义Adapter
  4. 为ListView设置自定义的adapter

其中,最重要的就是继承BaseAdapter去自定义Adapter。
BaseAdapter是包括ArrayAdapter和SimpleAdapter等Adapter的基类,是一个抽象类,自定义Adapter需要继承BaseAdapter并实现其抽象方法,具体如下:

方法名 含义
getView 创建item
getCount 获取列表长度
getItem 获取item数据对象
getItemId 根据索引获取item的id,通常直接返回索引号

其中最重要的就是实现getView方法,通过该方法就能够创建item的View将数据展示出来。
首先,创建item的自定义布局,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <ImageView
        android:id="@+id/ivAvatar"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@mipmap/ic_launcher"
        android:layout_margin="10dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
    <TextView
        android:id="@+id/tvName"
        android:text="name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        app:layout_constraintStart_toEndOf="@id/ivAvatar"
        app:layout_constraintTop_toTopOf="@id/ivAvatar"
        android:layout_marginLeft="20dp" />
    <TextView
        android:id="@+id/tvAge"
        android:text="10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="@id/tvName"
        app:layout_constraintBottom_toBottomOf="@id/ivAvatar"/>
    <Button
        android:id="@+id/btTest"
        android:text="button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="20dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginRight="20dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

然后,为item创建数据实体类ItemData,如下:

data class ItemData (
    val name : String,
    val age : Int,
    val avatar : Int
)

继承BaseAdapter类,自定义Adapter,如下:

class MineAdapter(var mContext
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值