Android的ListView控件学习改错历程
学校实验让实现:在程序界面建立一个ListView组件,组件分四行,每行三项,分别显示“赵林 男 20;钱杰 男 24;孙红 女 22;李成 男 29”,点击ListView组件某一行,在Toast组件中显示“你选择了XX”。这样的一个程序。也遇到了不少问题。
引言: ListView就相当于一个二维数组,可以通过创建一个一维数组再添加到ListView中即可实现。ListView的每一行就代表题目中要填写的每一个对象。
文件创建方面
一开始以为对应ListView中有几个行就要去创建几个对应行的xml文件,后来知道其实只需创建一个表示行格式的xml文件就可以,如下图:
控件添加方面
main.xml中只需加入ListView控件即可,list_item.xml文件中添加要创建的ListView每一行的格式,本例就直接把三个textview控件拖拽过去了。
编程方面
一开始不太懂SimpleAdapter mSimpleAdapter=new SimpleAdapter(this,listItem,R.layout.list_item,new String[]{“name”,“sex”,“age”},new int[]{R.id.textView1,R.id.textView2,R.id.textView3});
写成了:
SimpleAdapter mSimpleAdapter=new SimpleAdapter(this,listItem,R.layout.main,new String[]{"textView_1","textView_2","textView_3"},new int[]{R.id.textView1,R.id.textView2,R.id.textView3,R.id.textView3});
lv.setAdapter(mSimpleAdapter);
也就导致后来ListView界面显示的时候什么也没有
其实这里第三个参数应该表示的是接收listItem(第二个参数)类型的界面布局,也就是题目要求的每一行的格式,即创建的list_item.xml文件。而不是以为的main.xml文件。
ps:
第一个参数this指上下文
第二个参数listItem(名字自定):基于Map的list。listItem二维数组里边的每一项都和ListView里边的每一项对应。listItem里边的每一项都是一个Map类型,这个Map类里边包含了ListView每一行需要的数据。其实就是用来存储所有数据的二维数组,只不过是map类型的变量组成的。
第四个参数:String数组,数组的里面的每一项要与第二个参数中存入map集合的的key值一一对应。
第五个参数:int数组,数组的里面的每一项要与第二个参数中存入map集合的的values值一一对应。其实存的是list_item.xml文件里面对应的ID。
更改后如下:
HashMap<String,Object> map=new HashMap<String,Object>();
map.put("name", "赵林");
map.put("sex", "男");
map.put("age", "20");
listItem.add(map);
HashMap<String,Object> map1=new HashMap<String,Object>();
map1.put("name", "钱杰");
map1.put("sex", "男");
map1.put("age", "24");
listItem.add(map1);
HashMap<String,Object> map2=new HashMap<String,Object>();
map2.put("name", "孙红");
map2.put("sex", "女");
map2.put("age", "22");
listItem.add(map2);
HashMap<String,Object> map3=new HashMap<String,Object>();
map3.put("name", "李成");
map3.put("sex", "男");
map3.put("age", "29");
listItem.add(map3);
//这里是R.layout.list_item不是main
SimpleAdapter mSimpleAdapter=new SimpleAdapter(this,listItem,R.layout.list_item,new String[]{"name","sex","age"},new int[]{R.id.textView1,R.id.textView2,R.id.textView3});
lv.setAdapter(mSimpleAdapter);
最后实现
初级选手表示这次写代码又耗费了大量时间,对于调用的函数一定要看好参数再行事,你以为的对于计算机来说不可能变成你以为的,希望以后的bug对我宽容点~~。