ListView控件的使用

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()
        }
    }

点击效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值