当程序中有大量的数据需要展示时,就需要用到 ListView 啦。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。
1.基本性质
(1)由于数组中的数据无法直接传递给ListView,我们需要借助适配器(Adapter)来完成。
(2)Adapter有多种,需要根据ListView不同的使用情况选择不同的适配器。主要有两种ArrayAdapter / SimpleAdapter
ListView的关键操作是制作一个符合要求的Adapter,将数据注入ListView中。
2.ArrayAdapter / SimpleAdapter
ArrayAdapter适配器是数组适配器,只能去适配展示很简单的格局,只能展示条目Item的一个控件。
SimpleAdapter适配器是好用适配器,可以展示比ArrayAdapter复杂一些到格局,可以展示一个条目Item的多个控件。
两者创建的参数有所不同:
(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项(item)显示的布局,data:数据源变量);
(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:所要注入的数据源,layout:每个列表项(item)显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);
其中:
data要整理为符合的形式,ArrayAdapter的data形式是数组,SimpleAdapter 的形式是ArrayList<HashMap<String, Object>>。
SimpleAdapter最后两个参数,new String[]是指在已经建好的hashmap的键值所对应的数据取出,放入new int[]所对应的控件中。
ArrayAdapter:
private String[] data = {"Sunny","Cloudy","Few Clouds","Partly Cloudy","Overcast","Windy","Calm","Light Breeze"}; //通过泛型来指定要适配的数据类型,然后在构造函数中把适配的数据传入。 //android.R.layout.simple_list_item_1是ListView内置的一个子项布局,里面只有一个TextView,可显示一段文本 //data表示要适配的数据 ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data); ListView listView = (ListView)findViewById(R.id.list_view); //将构建好的适配器对象传进去 listView.setAdapter(adapter);
SimpleAdapter:
private String[] detail={"“白灼”是粤菜的一种烹调技法,就是用滚水或汤将食物烫熟。 多数的北方人都对“白灼”有一种概念上的混淆,认为白灼就是用白水煮一下捞出,其实不然,那是对字面上的一个误解,真正的白灼虾还是有几道工序的,经过一个朋友的指点,才得以顿悟。 白灼虾其实是最简单的,无需过多调料,没有繁杂的过程,也不必耗费大量的时间,甚至不用考虑食用时的温度,不用过多思忖摆盘的装饰,搭配一个同样简约的酸咸小味碟,就可以上桌了。 特别是想吃虾又懒得太操劳的人,可以选择做这道菜,简单又新鲜。也是我最钟爱的一道保留菜谱。 作为一只基围虾,衣衫齐整的出场体面面完整,无疑是对它的最高奖赏,绅士而优雅地被人类享用当然是最好的结局。", "相传,烤鸭之美,是源于名贵品种的北京鸭,它是当今世界最优质的一种肉食鸭。据说,这一特种纯北京鸭的饲养,约起于千年前左右,是因辽金元之历代帝王游猎,偶获此纯白野鸭种,后为游猎而养,一直延续下来,才得此优良纯种,并培育成今之名贵的肉食鸭种。即用填喂方法育肥的一种白鸭,故名“填鸭”。不仅如此,北京鸭曾在百年以前传至欧美,经繁育一鸣惊人。因而,作为优质品种的北京鸭,成为世界名贵鸭种来源已久。" }; private String[] title={"白灼虾","北京烤鸭"}; private int[] imageid={R.drawable.pic1,R.drawable.pic2}; List<HashMap<String, Object>> data;
data=new ArrayList<HashMap<String, Object>>(); for(int i=0;i<title.length;i++){ HashMap<String,Object> showitem = new HashMap<String,Object>(); showitem.put("name",title[i]); showitem.put("says",detail[i]); showitem.put("img",imageid[i]); data.add(showitem); } //创建SimpleAdapter SimpleAdapter adapter=new SimpleAdapter(getApplicationContext(),data,R.layout.list_item,new String[]{"name","says","img"},new int[]{R.id.text1,R.id.text2,R.id.img}); lstmenu.setAdapter(adapter);
下面是别人的代码,对每个参数有解释:
// 使用SimpleAdapter适配器 ListAdapter listAdapter = new SimpleAdapter(this, // 上下文 list, // 数据 android.R.layout.simple_list_item_2, // 使用系统的布局 new String[]{"id", "name"}, // 设置Map的key,数据从哪里来 new int[]{android.R.id.text1, android.R.id.text2}); // 系统布局的两个控件ID,数据设置到那里去 // 把适配器给ListView listView.setAdapter(listAdapter);
补充:
在J2EE中提供过一种非常好的框架–MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上。在Android中有这样一种高级控件,他的实现过程就类似于MVC框架。之所以称它高级,是因为他的使用不像其他控件一样,拖拽到界面上就能用,而是需要通过适配器将某些样式的数据或控件添加到其上而使用,这样的控件就是我们今天要说的AdapterView。
一:AdapterView–>V(视图)
1:作用
以列表的形式显示数据
2: 内容
AdapterView的内容一般是包含多项相同格式资源的列表
3:特点
(1)将前端显示和后端数据分离
(2)内容不能通过ListView.add的形式添加列表项,需指定一个Adapter对象,通过它获得显示数据
(3)ListView相当于MVC框架中的V(视图)
(4)Adapter相当于MVC框架中的C(控制器)
(5)数据源相当于MVC框架中的M(模型)
(6)超出屏幕显示之后,自动加上滚动条
4:分类
(1)ListView:列表,其中只能含有一个控件TextView,
(2)Spinner:下拉列表,给用户提供选择
(3)Gallery:缩略图,已经被水平的ScrollView和ViewPicker取代,但也还算常用,是一个可以把子项以中心锁定,水平滚动的列表
(4)GridView:网格图,以表格形式显示资源,可以左右滑动的
5:事件
(1)用户单击列表项事件
◆为列表加载setOnItemClieckListener监听,重写onItemClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。
(2)用户长按事件
◆为列表加载setOnItemLongClieckListener监听,重写onItemLongClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。
6:数据填充
借助下面的Adapter适配器对象从数据源中进行适配
二:Adapter–>C(控制器)
1:作用
把数据源中数据以某种样式(xml文件)显示在视图中。
2:分类
(1)ArrayAdapter:他只能处理列表项内容全是文本的情况。
◆数据源:数组或者List对象或者其他
(2)SimpleAdapter: 他不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。
◆数据源:只能为List<Map<“键”,“值”>>形式的数据
(3)自定义Adapter:根据xml文件中定义的样式惊醒列表项的填充,适用性最强。
(4)SimpleCursorAdapter:专门用于把游标中的数据映像到列表中(我们以后再来研究)
3:自定义Adapter
(1)创建类,继承自BaseAdapter
(2)重写其中的四个方法
①int getCount():返回的是数据源对象的个数,即列表项数
②Object getItem(int position):返回指定位置position上的列表
③long getItemId(int position):返回指定位置处的行ID
④View getView():返回列表项对应的视图,方法体中
◆实例化视图填充器
◆用视图填充器,根据Xml文件,实例化视图
◆根据布局找到控件,并设置属性
◆返回View视图
三:数据填充
1:声明AdapterView对象,根据ID利用findViewById方法找到此对象
2:声明Adapter对象,根据构造方法实例化此对象。具体如下:
(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量);
(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);
(3)自定义Adapter类 adapter = new 自定义Adapter类构造方法;
3:绑定Adapter对象到Adapter上
AdapterView对象.setAdapter(Adapter对象);
参考文章:MartinDongChang