今天接着学习控件,要学的是安卓里面的ListView。ListView在安卓中大家见得最多的地方是设置菜单,打开程序列表,点设置,我们看到的就是一个ListView。
ListView比前几节学习的东西要麻烦一些,这里分成两篇文章来详细讲解。
首先ListView要显示数据他需要绑定到数据源上,绑定数据需要用到适配器(Adapter),常用到的Adapter有ArrayAdapter、SimpleAdapter、BaseAdapter。今天先来学习用前两种来绑定数据。
首先学习ArrayAdapter,用ArrayAdapter可以实现简单的ListView的数据绑定,默认情况下,ArrayAdapter绑定每个对象的toString值到layout中预先定义的TextView控件。
我要实现的功能是用ListView显示几个网站的名称,点击的时候可以打开相应的网站。
布局文件很简单,只有一个ListView:
1 26 7 11 12 13
下面在的程序里面实现功能,先定义两个数组,第一个是网站的名称,第二个是网站的网址,两个数组里的数据相对应。
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 ArrayAdapteradapter=new ArrayAdapter (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 ArrayAdapteradapter=new ArrayAdapter (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 27 8 13 14 19
这个很容易理解,建立一个横向排列的LinearLayout布局,在里面放上一个ImageView控件和一个TextView控件。ImageView以前没讲过,就是一个显示图片的控件,相当于html里面的img,不再赘述。
然后在程序里面取得main.xml里面定义的ListView控件,用一个ArrayList来盛放数据
1 ListView lv=(ListView)findViewById(R.id.listView1); 2 ArrayList> alist=new ArrayList >(); 3 4 HashMap hMap=new HashMap (); 5 hMap.put("itempic", android.R.drawable.sym_action_call); 6 hMap.put("itemtext", "通话设置"); 7 alist.add(hMap); 8 HashMap hMap2=new HashMap (); 9 hMap2.put("itempic", android.R.drawable.ic_lock_silent_mode_off); 10 hMap2.put("itemtext", "声音"); 11 alist.add(hMap2); 12 HashMap hMap3=new HashMap (); 13 hMap3.put("itempic", android.R.drawable.stat_notify_sdcard); 14 hMap3.put("itemtext", "SD卡和手机内存"); 15 alist.add(hMap3); 16 HashMap hMap4=new HashMap (); 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> alist=new ArrayList >(); 21 22 HashMap hMap=new HashMap (); 23 hMap.put("itempic", android.R.drawable.sym_action_call); 24 hMap.put("itemtext", "通话设置"); 25 alist.add(hMap); 26 HashMap hMap2=new HashMap (); 27 hMap2.put("itempic", android.R.drawable.ic_lock_silent_mode_off); 28 hMap2.put("itemtext", "声音"); 29 alist.add(hMap2); 30 HashMap hMap3=new HashMap (); 31 hMap3.put("itempic", android.R.drawable.stat_notify_sdcard); 32 hMap3.put("itemtext", "SD卡和手机内存"); 33 alist.add(hMap3); 34 HashMap hMap4=new HashMap (); 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 }
附上程序截图,(有点难看...)
最后再附上源代码: