Android开发学习笔记——ListView、GridView和RecycleView
Android中的列表组件
- ListView
-
- ListView基本用法
-
- 简单用法
- 自定义item和Adapter
- 添加不同的列表项
-
- 添加Header和Footer
- 不同Item的ListView
- 更新数据
- ListView的简单优化
-
- 针对ConvertView的复用
- ViewHolder的使用
- 总结
- GridView
-
- GridView的基本使用
- RecyclerView
-
- RecyclerView使用
-
- RecyclerView的基本使用
- RecyclerView布局管理器使用
- RecyclerView添加不同表项
- RecyclerView数据更新
- RecyclerView和ListView的比较
- 总结
在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可以为列表子项提供点击事件。具体实现效果如下图:
自定义item和Adapter
通过Android提供的Adapter我们可以很简单地创建出一个简单的列表,但是一旦item中的元素复杂起来,需求多了起来,那么ArrayAdapter和SimpleAdapter等就无法轻易满足开发需求,此时,我们就需要去自定义item的实现了,主要包括以下几步:
- 自定义item布局
- 根据item所需数据创建自定义实体数据类
- 自定义Adapter
- 为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
锥度vs: 怎么看它生成的java代码
FengDai000: 写的很详细,排版也很用心,感谢大佬