ListView是由ListView控件、Adapter适配器、ListView子布局、传入的数据格式、指定Adapter适配器 共5个部分组成
首先,在想要使用ListView控件的地方写上ListView控件
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" tools:ignore="MissingConstraints" /> </androidx.constraintlayout.widget.ConstraintLayout>
编写ListView的每条的布局,也就是ListView的子布局
<?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="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <TextView android:id="@+id/text_name" android:layout_width="200dp" android:layout_height="wrap_content" android:text="name" android:gravity="center" android:textSize="32sp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent"/> <TextView android:id="@+id/text_sore" android:layout_width="200dp" app:layout_constraintHorizontal_weight="1" android:layout_height="wrap_content" android:text="sore" android:gravity="center" android:textSize="32sp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toRightOf="@id/text_name"/> </androidx.constraintlayout.widget.ConstraintLayout>
这里我写了两个并列的textview,效果如下:
编写传入数据的数据格式
data class Student(val name:String,val sore:Int)
编写一个类,规定你传入的数据格式。
最重要的部分来了,编写Adapter适配器
class Adapter(context: Context, private val resourceId: Int, data: ArrayList<Student>) :
ArrayAdapter<Student>(context, resourceId, data) {
//新增一个内部类来缓存控件的实例,可以提高listview的运行效率
inner class ViewHolder(val name: TextView, val sore: TextView)
//重载getView方法来建立 传入的数据 和 view 之间的连接
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
//用于缓存控件实例
val viewHolder: ViewHolder
//用于引入view
val view: View
//convertView可以缓存保存的view,使listView在滚动时不必重新加载
if (convertView == null) {
//引入view
view = LayoutInflater.from(context).inflate(resourceId, parent, false)
//创建控件实例
val name: TextView = view.findViewById(R.id.text_name)
val sore: TextView = view.findViewById(R.id.text_sore)
//缓存控件实例
viewHolder = ViewHolder(name, sore)
//将viewHolder保存到View中
view.tag = viewHolder
} else {
view = convertView
viewHolder = view.tag as ViewHolder
}
//根据位置取出数据
val student = getItem(position)
//写入缓存的View实例中
if (student != null) {
viewHolder.name.text = student.name
viewHolder.sore.text = student.sore.toString().ifEmpty { "Error" }
}
return view
}
}
最后,指定适配器并传入数据
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityMainBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
//构建假数据,测试使用
val list = ArrayList<Student>()
repeat(10) {
list.add(Student("A1", 89))
list.add(Student("B2", 89))
list.add(Student("C3", 89))
}
//指定适配器并将数据传入
binding.listView.adapter = Adapter(this, R.layout.item_student, list)
setContentView(binding.root)
}
}
执行效果如下:
设置子项点击事件
//为listview中的子项设置点击
binding.listView.setOnItemClickListener { parent, view, position, id ->
val student = list[position]
Toast.makeText(this, "name:${student.name},sore:${student.sore}", Toast.LENGTH_LONG)
.show()
}
}
点击效果如下:文章来源:https://www.toymoban.com/news/detail-417537.html
文章来源地址https://www.toymoban.com/news/detail-417537.html
到了这里,关于ListView控件的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!