一起学Android之ListView
程序员文章站
2022-06-23 19:03:17
本文以一个小例子,简述Android开发中ListView的相关应用,仅供学习分享使用。 ......
本文以一个小例子,简述android开发中listview的相关应用,仅供学习分享使用。
概述
listview是一个显示可滚动项目列表的视图组(view group),列表项通过适配器(adapter)将数组或者数据库查询等数据源中的数据插入到列表中,并将每一个项的内容转换到视图中显示出来。
数据填充步骤
- 构建数据源,如数组,列表等。
- 将数据源填充到适配器中。
- 将适配器绑定到列表中。
涉及知识点
- android:dividerheight 设置列表项分割线的高度。
- android:divider 设置分割线的颜色。
- android:listselector 设置选中项的背景色。
- android:choicemode 设置选择模式,如单选,多选等。
- arrayadapter 数据适配器,用于将数组类型的数据源填充到适配器。
- addheaderview 增加header视图,必须在setadapter之前调用。
- addfooterview 增加尾部视图。
- setonitemclicklistener 设置列表项点击监听事件。
- setonitemlongclicklistener 设置列表项长按监听事件。事件有个返回值,如果返回true 表示被处理,只响应长按事件,如果返回false,表示还会响应单击事件。
ui结构
关于view和viewgroup之间的关系,如下图所示:
示例截图
listview效果图如下所示:
示例源码
xml布局源码如下:
1 <listview 2 android:id="@+id/lv_info" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:dividerheight="2dp" 6 android:divider="@color/colordivider" 7 android:choicemode="singlechoice" 8 android:listselector="@color/colorselected" 9 />
绑定数据源代码如下(包括增加header和footer):
1 mlistview= (listview) this.findviewbyid(r.id.lv_info); 2 //1.初始化数据源 3 lstinfo=new arraylist<>(); 4 for(int i=0;i<20;i++){ 5 lstinfo.add("item=>"+i); 6 } 7 //2.构造适配器 8 adapter=new arrayadapter<string>(mainactivity.this,android.r.layout.simple_list_item_1,lstinfo); 9 //3.给listview赋值 10 //addheaderview必须在setadapter之前设置,否则不起作用 11 textview textview=new textview(mainactivity.this); 12 textview.settext("listview的小例子"); 13 textview.settextsize(20); 14 textview.setlayoutparams(new abslistview.layoutparams(viewgroup.layoutparams.match_parent, viewgroup.layoutparams.wrap_content)); 15 mlistview.addheaderview(textview); 16 mlistview.setadapter(adapter); 17 button btnmore=new button(mainactivity.this); 18 btnmore.settext("加载更多..."); 19 textview.settextsize(20); 20 btnmore.setlayoutparams(new abslistview.layoutparams(viewgroup.layoutparams.match_parent, viewgroup.layoutparams.wrap_content)); 21 btnmore.setonclicklistener(new view.onclicklistener() { 22 @override 23 public void onclick(view v) { 24 int index=lstinfo.size(); 25 for(int i=index;i<index+20;i++){ 26 lstinfo.add("item=>"+(i)); 27 } 28 adapter.notifydatasetchanged(); 29 } 30 }); 31 mlistview.addfooterview(btnmore);
事件监听代码如下:
1 mlistview.setonitemclicklistener(new adapterview.onitemclicklistener() { 2 3 /** 4 * 5 * @param parent 表示控件的主体,此处表示listview 6 * @param view 表示当前被点击的项对应的控件 7 * @param position 表示当前点击项的索引位置 8 * @param id 被点击的行的id 9 */ 10 @override 11 public void onitemclick(adapterview<?> parent, view view, int position, long id) { 12 string s1 = parent.getitematposition(position).tostring(); 13 toast.maketext(mainactivity.this, "当前点击的是=>" + s1, toast.length_short).show(); 14 } 15 }); 16 mlistview.setonitemlongclicklistener(new adapterview.onitemlongclicklistener() { 17 18 /** 19 * @param parent 表示控件的主体,此处表示listview 20 * @param view 表示当前被点击的项对应的控件 21 * @param position 表示当前点击项的索引位置 22 * @param id 被点击的行的id 23 * @return 如果返回true 表示被处理,只响应长按事件,如果返回false,表示还会响应单击事件 24 */ 25 @override 26 public boolean onitemlongclick(adapterview<?> parent, view view, int position, long id) { 27 string s1=parent.getitematposition(position).tostring(); 28 toast.maketext(mainactivity.this,"当前长按的是=>"+s1,toast.length_short).show(); 29 return true; 30 } 31 });
复杂列表
当lisvview中的列表项有多个内容时,可以使用simpleadapter来实现多列显示。
示例效果图如下:
步骤如下:
1. 定义一个listview_item.xml的列表项布局文件。
1 <?xml version="1.0" encoding="utf-8"?> 2 <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 <textview 6 android:id="@+id/tv_name" 7 android:layout_width="wrap_content" 8 android:layout_weight="1" 9 android:layout_height="wrap_content"/> 10 <textview 11 android:id="@+id/tv_age" 12 android:layout_weight="1" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content"/> 15 <textview 16 android:id="@+id/tv_love" 17 android:layout_weight="1" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content"/> 20 </linearlayout>
2. 代码中将适配器的和布局文件关联起来(采用list<map<string ,object>>作为数据源)
1 mlistview2= (listview) this.findviewbyid(r.id.lv_info2); 2 //1. 构造数据源 3 list<map<string ,object>> lst=new arraylist<map<string ,object>>(); 4 for(int i=0;i<20;i++){ 5 map<string ,object> map=new hashmap<string,object>(); 6 map.put("colname","张三"+i); 7 map.put("colage",18+i); 8 map.put("collove","篮球"+i); 9 lst.add(map); 10 } 11 //2. 构造适配器填充 12 simpleadapter adapter=new simpleadapter(main2activity.this,lst, 13 r.layout.listview_item, 14 new string[]{"colname","colage","collove"}, 15 new int[]{ r.id.tv_name,r.id.tv_age,r.id.tv_love}); 16 //3. 绑定适配器 17 mlistview2.setadapter(adapter);
3. 点击事件,获取内容
1 mlistview2.setonitemclicklistener(new adapterview.onitemclicklistener() { 2 @override 3 public void onitemclick(adapterview<?> parent, view view, int position, long id) { 4 string s1 = parent.getitematposition(position).tostring();//此处返回的是键值对转换后的字符串 5 textview tvname= (textview) view.findviewbyid(r.id.tv_name); 6 textview tvage= (textview) view.findviewbyid(r.id.tv_age); 7 textview tvlove= (textview) view.findviewbyid(r.id.tv_love); 8 string s2="name=>"+tvname.gettext()+"age=>"+tvage.gettext()+"love=>"+tvlove.gettext(); 9 toast.maketext(main2activity.this, "当前点击的是s1=>" + s1+"s2=>"+s2, toast.length_short).show(); 10 } 11 });
备注
本文为入门级学习知识总结,如有不足之处,还请指正,谢谢。