今天接着学习控件,要学的是安卓里面的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 }

效果如图

Android ListView自带adapter 安卓listview控件_安卓ListView

点击腾讯以后

Android ListView自带adapter 安卓listview控件_数据_02

下面讲解用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 }

附上程序截图,(有点难看...)

Android ListView自带adapter 安卓listview控件_安卓ListView_03