当前位置: 移动技术网 > 移动技术>移动开发>Android > 一起学Android之ListView

一起学Android之ListView

2019年01月21日  | 移动技术网移动技术  | 我要评论

本文以一个小例子,简述android开发中listview的相关应用,仅供学习分享使用。

概述

listview是一个显示可滚动项目列表的视图组(view group),列表项通过适配器(adapter)将数组或者数据库查询等数据源中的数据插入到列表中,并将每一个项的内容转换到视图中显示出来。

数据填充步骤

  1. 构建数据源,如数组,列表等。
  2. 将数据源填充到适配器中。
  3. 将适配器绑定到列表中。

涉及知识点

  •  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         });

备注

本文为入门级学习知识总结,如有不足之处,还请指正,谢谢。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网