Android入门(listview控件)
很烦,,,写了好久然后浏览器闪退了。。。然后写的全无了。
所以再写一遍就随便写点了。使用listview的关键。
基本使用
- 直接在布局引入一个listview控件
- 然后因为listview的数据不能直接传入。需要通过adapter适配器来实现的,其中最常用的就是arrayAdapter
- 因此在activity中,初始化一个arrayAdapter。
他的初始化一共需要三个参数。- activity:也就是需要把本类传进去。
- resourceid: 需要传入子项布局(也就是listview中每一项内容的样式布局)(可以使用系统默认的,也可以自己定义一个布局。这里不展示)
- data:传入数据源,一般都是列表。
- 然后使lisview的adapter属性赋值为你初始的内容然后即完成了基本使用。
1
listview.adapter = arrayAdapter<String>()
进阶使用
主要就是修改第二个参数,resourceid,也就是你自己定义的布局和样式。但是你不止需要样式,还需要设置逻辑。
因此这里选择再写一个适配器FruitAdapter
去继承ArrayAdapter,然后重写getView()
方法,实现重现。
getView()的三个属性
- position:表明当前的对应的在数据源的第几个序列
- convertView: 用来缓存View,如果已经有缓存,可以大大提高效率。
- 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
27class 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
}
}
提高效率
- 使用convertView,他已经缓存了页面,可以大大提高运行效率
- 使用viewholder,他可以被存放在
view.tag
中。也可以从convertView中取出。使用它可以避免很多次findViewById
以上两种方法可以大大的提高效率
点击事件
直接上示例代码
1 | listView.setOnItemClickListener { parent, view, position, id -> |
其中如果有不需要用到的参数,可以直接用_
代替,不去接受
1
2
3
4listView.setOnItemClickListener { _,_, position, _ ->
val fruit = fruitList[position]
Toast.makeText(this, fruit.name, Toast.LENGTH_SHORT).show()
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小贺同学的blog!
评论