列表作为最常用的控件之一,还是有必要好好学习的,本章以一个初学者的角度来学习列表视图,列表视图的属性,以及基本适配器简单定义,至于列表视图优化这些,我们一步步来
目录
列表视图的简单用法定制列表视图的界面提升列表视图的运行效率列表视图的点击事件
ListView 的简单用法
在布局中加入列表视图控件还算简单,先为列表视图指定一个id,然后将宽度和高度都设置为匹配_父项这样列表视图就占满了整个布局的空间
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
xmlns:tools=' http://模式。安卓。' com/tools '
安卓:方向='垂直'
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
列表视图
android:id='@ id/listView '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '/
/线性布局
接下来修改主要活动中的代码
类主要活动:app compat activity(){
private val data=listOf('苹果','香蕉','橘子','西瓜,
"梨"、"葡萄"、"菠萝"、"草莓"、"樱桃"、"芒果",
'苹果','香蕉','橘子','西瓜','梨','葡萄,
"菠萝"、"草莓"、"樱桃"、"芒果")
覆盖fun onCreate(savedInstanceState:Bundle?) {
super.onCreate(保存实例)
setContentView(r . layout。活动_主要)
val adapter=ArrayAdapterString(这个,安卓. R.layout.simple_list_item_1,data)
listView.adapter=适配器
}
}
先将数据准备好,然后借助适配器将数据传递给列表视图。ArrayAdapter是机器人提供的一种适配器的实现类,可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传入。在ArrayAdapter的构造函数中依次传入活动的实例、列表视图子项布局的身份证,数据源,这里我们使用了安卓r .布局.简单_列表_项目_1作为列表视图子项布局的id,这是一个机器人内置的布局文件,里面只有一个文本视图,可用于简单地显式一段文本。最后,调用列表视图的setAdapter()方法,将构建好的适配器对象传递进去,这样列表视图和数据之间的关联就建立完成了
定制 ListView 的界面
只能显示一段文本的列表视图实在太单调了,我们现在希望定制列表视图的界面,让它能显示文本和图片
在需要列表视图的子项指定一个我们自定义的布局,在布局目录下新建fruit_item.xml
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
xmlns:tools=' http://模式。安卓。' com/tools '
Android:layout _ width=' match _ parent '
android:layout_height='60dp '
图像视图
android:id='@ id/fruitImage '
android:layout_width='40dp '
android:layout_height='40dp '
Android:layout _ gravity=' center _ vertical '
Android:layout _ margin left=' 10dp '
工具:ignore='ContentDescription,RtlHardcoded' /
文本视图
android:id='@ id/fruitName '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '
Android:layout _ gravity=' center _ vertical '
Android:layout _ margin left=' 10dp '
工具:ignore='RtlHardcoded' /
/线性布局
定义一个实体类,作为列表视图适配器的适配类型
类FruitAdapter(activity: Activity,val resourceId: Int,data: ListFruit):
ArrayAdapterFruit(activity,resourceId,data) {
@SuppressLint('ViewHolder ')
覆盖fun getView(position: Int,convertView: View?父级:视图组):视图{
val view=LayoutInflater.from(上下文)。inflate(resourceId,parent,false)
val水果图像:ImageView=view。findviewbyid(r . id。水果图像)
val果名:TextView=view。findviewbyid(r . id。果名)
val fruit=getItem(位置)
如果(果!=null) {
水果形象。setimageresource(水果。imageid)
水果名。文本=水果名
}
返回视图
}
}
水果适配器类继承自ArrayAdapter,并泛型指定为水果类,重写getView()方法。在getView()方法中,首先使用布局充气机来为这个子项加载我们传入的布局,再调用视角的findViewById()方法分别获取图像视图和文本视图,然后通过getItem()方法得到当前项的水果实例,设置显示的图片和文字,最后将布局返回
最后修改主要活动中的代码
类主要活动:app compat activity(){
private val水果列表=ArrayListFruit()
private val data=listOf('苹果','香蕉','橘子','西瓜,
"梨"、"葡萄"、"菠萝"、"草莓"、"樱桃"、"芒果",
'苹果','香蕉','橘子','西瓜','梨','葡萄,
"菠萝"、"草莓"、"樱桃"、"芒果")
覆盖fun onCreate(savedInstanceState:Bundle?) {
super.onCreate(保存实例)
setContentView(r . layout。活动_主要)
initFruits()
val adapter=FruitAdapter(this,R.layout.fruit_item,fruitList)
listView.adapter=适配器
}
私人基金initFruits() {
重复(2) {
fruitList.add(Fruit('Apple ',R.drawable.apple_pic))
fruitList.add(水果('香蕉',R.drawable.banana_pic))
fruitList.add(Fruit('Orange ',R.drawable.orange_pic))
fruitList.add(水果('西瓜R.drawable。西瓜_pic))
fruitList.add(Fruit('Pear ',R.drawable.pear_pic))
fruitList.add(Fruit('Grape ',R.drawable.grape_pic))
fruitList.add(水果('菠萝R.drawable。菠萝_pic))
水果清单。添加(水果('草莓',R.drawable.strawberry_pic))
fruitList.add(Fruit('Cherry ',R.drawable.cherry_pic))
fruitList.add(水果('芒果',R.drawable.mango_pic))
}
}
}
提升 ListView 的运行效率
getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后进行重用,我们可以借助这个参数进行性能优化
类FruitAdapter(activity: Activity,val resourceId: Int,data: ListFruit):
ArrayAdapterFruit(activity,resourceId,data) {
@SuppressLint('ViewHolder ')
覆盖fun getView(position: Int,convertView: View?父级:视图组):视图{
英国压力单位视图:视图
if (convertView==null) {
view=LayoutInflater.from(上下文)。inflate(resourceId,parent,false)
}否则{
view=convertView
}
val水果图像:ImageView=view。findviewbyid(r . id。水果图像)
val果名:TextView=view。findviewbyid(r . id。果名)
val fruit=getItem(位置)
如果(果!=null) {
水果形象。setimageresource(水果。imageid)
水果名。文本=水果名
}
返回视图
}
}
我们在getView()方法中进行了判断:如果convertView为空,则使用布局充气机去加载布局;如果不为空,则直接对convertView进行重用
目前代码还可以继续优化,每次在getView()方法中仍然会调用视角的findViewById方法去获取一次控件的实例,我们可以借助一个取景器来对这部分性能进行优化,修改水果适配器中的代码
类FruitAdapter(activity: Activity,val resourceId: Int,data: ListFruit):
ArrayAdapterFruit(activity,resourceId,data) {
内部类视图固定器(val fruit image:ImageView,val fruitName: TextView)
@SuppressLint('ViewHolder ')
覆盖fun getView(position: Int,convertView: View?父级:视图组):视图{
英国压力单位视图:视图
英国压力单位视图持有者:视图持有者
if (convertView==null) {
view=LayoutInflater.from(上下文)。inflate(resourceId,parent,false)
val水果图像:ImageView=view。findviewbyid(r . id。水果图像)
val fruitname:text view=view。findviewbyid(r . id。果名)
视图持有者=视图持有者(水果图像,水果名称)
view.tag=viewHolder
}否则
视图=转换视图
viewholder=视图。标记为视图持有者
}
val fruit=getItem(位置)
如果(果!=null)>
视图支架。水果图像。setimagesource(水果。imageid)
视图支架。果名。文字=水果。名字
}
返回视图
}
}
我们新增一个内部类取景框(查看者),用于对图像视图-影像检视和文本视图的控件实例进行缓存。当转换视图(转换视图)为空值时,创建一个取景框(查看者)对象,并将控件的实例存放在取景框(查看者)里,然后调用视图(视图)的设置标签()方法,将取景框(查看者)对象存储在视图(视图)中
ListView 的点击事件
列表视图(列表视图)的滚动毕竟只是满足我们视觉上的效果,因此本节学习列表视图(列表视图)如何才能响应用户的点击事件
主要活动类:appcompatactivity()
private val fruit list=arraylistfruit()
-我.
覆盖fun onCreate(保存dinstancestat:bundle?复写fun oncreate?)>
超级。oncreate(保存实例状态)
设置内容视图(请参阅布局.活动_主要)
initFruits()
val adapter=FruitAdapter(this,R.layout.fruit_item,fruitList)
listView.adapter=适配器
/* val adapter=数组适配器字符串(this,android).R.layout.simple_list_item_1,日期)*/
/*列表视图.适配器=适配器*/
列表视图。setnitmclicklistener {父级,视图,位置,id -
val水果=水果清单[位置]
烤面包。makeText(这,水果。名称,烤面包. S7-1200可编程控制器显示()
}
}
}
到此这篇关于安卓系统入门教程之列表视图(列表视图)的具体使用详解的文章就介绍到这了,更多相关Android列表视图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。