很烦,,,写了好久然后浏览器闪退了。。。然后写的全无了。
所以再写一遍就随便写点了。使用listview的关键。

基本使用

  1. 直接在布局引入一个listview控件
  2. 然后因为listview的数据不能直接传入。需要通过adapter适配器来实现的,其中最常用的就是arrayAdapter
  3. 因此在activity中,初始化一个arrayAdapter。
    他的初始化一共需要三个参数。
    1. activity:也就是需要把本类传进去。
    2. resourceid: 需要传入子项布局(也就是listview中每一项内容的样式布局)(可以使用系统默认的,也可以自己定义一个布局。这里不展示)
    3. data:传入数据源,一般都是列表。
  4. 然后使lisview的adapter属性赋值为你初始的内容
    1
    listview.adapter = arrayAdapter<String>()
    然后即完成了基本使用。

进阶使用

主要就是修改第二个参数,resourceid,也就是你自己定义的布局和样式。但是你不止需要样式,还需要设置逻辑。
因此这里选择再写一个适配器FruitAdapter去继承ArrayAdapter,然后重写getView()方法,实现重现。
getView()的三个属性

  1. position:表明当前的对应的在数据源的第几个序列
  2. convertView: 用来缓存View,如果已经有缓存,可以大大提高效率。
  3. parent:父元素
    具体的逻辑就是:先获取你需要修改的布局,并将其转化成view。然后通过函数来修改其中每个部分的内容。以下是个示例代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class Fruit(val name: String, val imageId: Int) {
    }
    class FruiterAdapter(activity: Activity, val resourceId: Int, data: List<Fruit>) :
    ArrayAdapter<Fruit>(activity, resourceId, data) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
    //直接将布局文件转化为View类
    val view = LayoutInflater.from(context).inflate(resourceId, parent, false)
    val fruitImage: ImageView = view.findViewById(R.id.fruitImage)
    val fruitName: TextView = view.findViewById(R.id.fruitName)
    val fruit = getItem(position)//获取当前项的Fruit实例
    if (fruit != null) {
    fruitImage.setImageResource(fruit.imageId)
    fruitName.text = fruit.name
    }
    return view
    //使用视图绑定
    // var binding = FruitItemBinding.inflate(LayoutInflater.from(context),parent,false)
    // binding.apply {
    // var fruit = getItem(position)
    // if(fruit!=null){
    // fruitImage.setImageResource(fruit.imageId)
    // fruitName.text = fruit.name
    // }
    // }
    // return binding.root
    }
    }

提高效率

  1. 使用convertView,他已经缓存了页面,可以大大提高运行效率
  2. 使用viewholder,他可以被存放在view.tag中。也可以从convertView中取出。使用它可以避免很多次findViewById
    以上两种方法可以大大的提高效率

点击事件

直接上示例代码

1
2
3
4
listView.setOnItemClickListener { parent, view, position, id ->
val fruit = fruitList[position]
Toast.makeText(this, fruit.name, Toast.LENGTH_SHORT).show()
}

其中如果有不需要用到的参数,可以直接用_代替,不去接受

1
2
3
4
listView.setOnItemClickListener { _,_, position, _ ->
val fruit = fruitList[position]
Toast.makeText(this, fruit.name, Toast.LENGTH_SHORT).show()
}