一、简单的list列表使用
baseAdapter、SimpleAdapter
二、list列表中添加事件
list列表布局
加载离线数据、获取网络数据
点击事件,延展、收起数据等三、listview列表嵌套listview、ScrollView下嵌套listview、横向排列、添加GradView等复杂的列表
1、ArrayAdapter
① // 列表项的数据
String[] strs = { "1", "2", "3", "4", "5" ,"1", "2", "3", "4", "5","1", "2", "3", "4", "5"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1, strs);
/*
* ArrayAdapter的构造需要三个参数,依次为
* this,
* 布局文件(注意这里的布局文件描述的是列表的每一行的布局,
* android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,
* 数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。*/
setListAdapter(adapter);
② 上一个例子中的strs字符串数组也可以设置成list列表
ListView listView = new ListView(this);
listView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1, getData()));
setContentView(listView);
添加方法getData();
private List<String> getData() {
List<String> data = new ArrayList<String>();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");
return data;
}
2、SimpleAdapter
* 使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行
*/
SimpleAdapter adapter = new SimpleAdapter(this, getData(),
R.layout.test_simpleadapter, new String[] { "title", "img","content" },
new int[] { R.id.title,R.id.img, R.id.content});
setListAdapter(adapter);
getData()获取数据源
private List<Map<String, Object>> getData() {
// map.put(参数名字,参数值)
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "摩托罗拉");
map.put("img", R.drawable.zem13);
map.put("content", "简介");
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "诺基亚");
map.put("img", R.drawable.zem12);
map.put("content", "简介");
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "三星");
map.put("content", "简介");
map.put("img", R.drawable.zem12);
list.add(map);
return list;}
/*
* ListView
*
* ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,
* 这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,
* 再为每一个Item都创建一个View对象
* ,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);
* 从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,
* 就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,
* 而此时调用的getView中的convertView参数就是滚出屏幕的Item的View
* 所以说如果能重用这个convertView,就会大大改善性能。
*/
/*
* listView在开始绘制的时候,系统首先调用getCount()函数,
* 根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),
* 然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,
* 列表将不显示同样return 1,就只显示一行。
*
* 系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。
* 当手动完成适配时,必须手动映射数据,这需要重写getView()方法。
* 系统在绘制列表的每一行的时候将调用此方法。
* getView()有三个参数,position表示将显示的是第几行,
* covertView是从布局文件中inflate来的布局。我
* 们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。
* 然后将xml文件中的各个组件实例化(简单的findViewById()方法)。
* 这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,
* 这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。
* 系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,
* 怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),
* 然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。
* 在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,
* 只要布局文件中将Button设置为没有焦点就OK了。
*
*/
/*
* 一个Adapter是AdapterView视图与数据之间的桥梁,Adapter提供对数据的访问,
* 也负责为每一项数据产生一个对应的View。
*
*/