今天接着学习控件,要学的是安卓里面的ListView。ListView在安卓中大家见得最多的地方是设置菜单,打开程序列表,点设置,我们看到的就是一个ListView。
ListView比前几节学习的东西要麻烦一些,这里分成两篇文章来详细讲解。
首先ListView要显示数据他需要绑定到数据源上,绑定数据需要用到适配器(Adapter),常用到的Adapter有ArrayAdapter、SimpleAdapter、BaseAdapter。今天先来学习用前两种来绑定数据。
首先学习ArrayAdapter,用ArrayAdapter可以实现简单的ListView的数据绑定,默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件。
我要实现的功能是用ListView显示几个网站的名称,点击的时候可以打开相应的网站。
布局文件很简单,只有一个ListView:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <ListView
8 android:id="@+id/listView1"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content" >
11 </ListView>
12
13 </LinearLayout>
下面在的程序里面实现功能,先定义两个数组,第一个是网站的名称,第二个是网站的网址,两个数组里的数据相对应。
final String[] strings=new String[]{"百度","新浪","腾讯","网易"};
final String[] stringurl=new String[]{"http://www.baidu.com/","http://www.sina.com.cn/","http://www.qq.com/","http://www.163.com/"};
然后获取到ListView对象,绑定数据
1 ListView lv=(ListView)findViewById(R.id.listView1);
2 ArrayAdapter<String> adapter=new ArrayAdapter<String>(ListView_ArrayAdapterActivity.this, android.R.layout.simple_list_item_1, strings);
3 lv.setAdapter(adapter);
ArrayAdapter的构造方法用的是public ArrayAdapter(android.content.Context context, int textViewResourceId, java.lang.Object[] objects);第一个参数是当前上下文,第二个参数是TextView的id,第三个是要绑定的数据。这里详细说明下第二个参数,这个参数可以是自定义的一个layout,但是这个layout里面必须要有一个TextView控件。这里我们使用的是android提供的一个资源。
到这里绑定数据就结束了,还要实现每一个项被点击的时候能跳转到相应的网站,为ListView的项添加事件,用到的是public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener listener);如下
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse(stringurl[arg2]));
startActivity(intent);
}
});
这段代码处理了ListView的onItemClick事件,用intent调用打开网页的程序,到这里全部功能就实现了。下面贴上完整代码
1 package com.yyj.ListView_ArrayAdapter;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.net.Uri;
6 import android.os.Bundle;
7 import android.view.View;
8 import android.widget.AdapterView;
9 import android.widget.AdapterView.OnItemClickListener;
10 import android.widget.ArrayAdapter;
11 import android.widget.ListView;
12
13 public class ListView_ArrayAdapterActivity extends Activity {
14 final String[] strings=new String[]{"百度","新浪","腾讯","网易"};
15 final String[] stringurl=new String[]{"http://www.baidu.com/","http://www.sina.com.cn/","http://www.qq.com/","http://www.163.com/"};
16 /** Called when the activity is first created. */
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.main);
21 setTitle("打开网页");
22
23 ListView lv=(ListView)findViewById(R.id.listView1);
24 ArrayAdapter<String> adapter=new ArrayAdapter<String>(ListView_ArrayAdapterActivity.this, android.R.layout.simple_list_item_1, strings);
25 lv.setAdapter(adapter);
26
27 lv.setOnItemClickListener(new OnItemClickListener() {
28
29 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
30 Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse(stringurl[arg2]));
31 startActivity(intent);
32 }
33 });
34 }
35 }
效果如图
点击腾讯以后
下面讲解用SimpleAdapter来为ListView绑定数据,这个可以实现复杂一些的功能,除了文字,使用它还可以绑定图片,多选框等。
我们来用它实现一个类似于应用程序列表里面的设置的界面。
用SimpleAdapter来为ListView绑定数据,比用ArrayAdapter稍微复杂。我们除了要有一个main.xml,还要在layout里面在新建另一个xml文件来作为ListView的每一项。
main.xml和上一个用的完全一样,不在贴代码,下面来看我新建的item.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:id="@+id/linearLayout1"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 android:orientation="horizontal">
7
8 <ImageView
9 android:id="@+id/ivpic"
10 android:layout_width="35dp"
11 android:layout_height="35dp"
12 android:src="@drawable/ic_launcher" />
13
14 <TextView
15 android:id="@+id/tvtext"
16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content"
18 android:textSize="20sp" />
19 </LinearLayout>
这个很容易理解,建立一个横向排列的LinearLayout布局,在里面放上一个ImageView控件和一个TextView控件。ImageView以前没讲过,就是一个显示图片的控件,相当于html里面的img,不再赘述。
然后在程序里面取得main.xml里面定义的ListView控件,用一个ArrayList来盛放数据
1 ListView lv=(ListView)findViewById(R.id.listView1);
2 ArrayList<HashMap<String, Object>> alist=new ArrayList<HashMap<String,Object>>();
3
4 HashMap<String, Object> hMap=new HashMap<String, Object>();
5 hMap.put("itempic", android.R.drawable.sym_action_call);
6 hMap.put("itemtext", "通话设置");
7 alist.add(hMap);
8 HashMap<String, Object> hMap2=new HashMap<String, Object>();
9 hMap2.put("itempic", android.R.drawable.ic_lock_silent_mode_off);
10 hMap2.put("itemtext", "声音");
11 alist.add(hMap2);
12 HashMap<String, Object> hMap3=new HashMap<String, Object>();
13 hMap3.put("itempic", android.R.drawable.stat_notify_sdcard);
14 hMap3.put("itemtext", "SD卡和手机内存");
15 alist.add(hMap3);
16 HashMap<String, Object> hMap4=new HashMap<String, Object>();
17 hMap4.put("itempic", android.R.drawable.ic_menu_info_details);
18 hMap4.put("itemtext", "关于手机");
19 alist.add(hMap4);
我添加了我的手机设置里面的四项。里面的android.R.drawable.xxx是android系统内置的资源,因为有的找不全对应的图片,所以只是写了四项。然后就是绑定数据部分了。
SimpleAdapter adapter=new SimpleAdapter(ListView_SimpleAdapterActivity.this,alist, R.layout.item, new String[]{"itempic","itemtext"},new int[]{R.id.ivpic,R.id.tvtext});
lv.setAdapter(adapter);
SimpleAdapter构造方法里面的参数分别是 上下文、绑定的数据、每一行的布局文件(这里是item.xml),后面是一个String数组和一个int数组,这两个数组里面的内容相对应,就是把ArrayList里面的HashMap里面的值放到item.xml里面相应的控件里面。额。。。有点绕,最后在调用LIstView的setAdapter方法绑定数据。这个过程也就完成了,然后如果要给每一行添加事件的话,就和上面的ArrayAdapter绑定数据是一样的了。
完整的代码是
1 package com.yyj.ListView_SimpleAdapter;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5
6 import android.app.Activity;
7 import android.os.Bundle;
8 import android.widget.ListView;
9 import android.widget.SimpleAdapter;
10
11 public class ListView_SimpleAdapterActivity extends Activity {
12 /** Called when the activity is first created. */
13 @Override
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main);
17 setTitle("设置");
18
19 ListView lv=(ListView)findViewById(R.id.listView1);
20 ArrayList<HashMap<String, Object>> alist=new ArrayList<HashMap<String,Object>>();
21
22 HashMap<String, Object> hMap=new HashMap<String, Object>();
23 hMap.put("itempic", android.R.drawable.sym_action_call);
24 hMap.put("itemtext", "通话设置");
25 alist.add(hMap);
26 HashMap<String, Object> hMap2=new HashMap<String, Object>();
27 hMap2.put("itempic", android.R.drawable.ic_lock_silent_mode_off);
28 hMap2.put("itemtext", "声音");
29 alist.add(hMap2);
30 HashMap<String, Object> hMap3=new HashMap<String, Object>();
31 hMap3.put("itempic", android.R.drawable.stat_notify_sdcard);
32 hMap3.put("itemtext", "SD卡和手机内存");
33 alist.add(hMap3);
34 HashMap<String, Object> hMap4=new HashMap<String, Object>();
35 hMap4.put("itempic", android.R.drawable.ic_menu_info_details);
36 hMap4.put("itemtext", "关于手机");
37 alist.add(hMap4);
38
39 SimpleAdapter adapter=new SimpleAdapter(ListView_SimpleAdapterActivity.this,
40 alist, R.layout.item, new String[]{"itempic","itemtext"},new int[]{R.id.ivpic,R.id.tvtext});
41 lv.setAdapter(adapter);
42 }
43 }
附上程序截图,(有点难看...)