ListView使用详解,listActivity使用方法

OPhone开发中经常会用到各种各样的组件,像TextView,Button等等。其中经常会使用到ListView(列表),ListView以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。本篇将由浅入深的介绍几种列表,并着重介绍如何自定义列表。具体的表现形式如图1所示。在OPhone系统中,列表的显示需要三个元素:

1.ListVeiw 用来展示列表的View。

2.适配器 用来把数据映射到ListView上的中介。

3.数据    具体的将被映射的字符串,图片,或者基本组件。

根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

其中以ArrayAdapter最为简单,只能展示一行字,如图1所示。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。

ArrayAdapter

使用ArrayAdapter显示列表非常简单。代码如下:

  1. public class List1 extendsActivity {
  2. private ListVeiw listView;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. listView=new ListVeiw(this);
  7. listView.setAdapter(new ArrayAdapter<String>(this,
  8. android.R.layout.simple_list_item_1, mStrings));
  9. setContentVieww(listView);
  10. }
  11. private String[] mStrings = {
  12. "Abbaye de Belloc", "Abbaye du Mont des Cats",
  13. "Acorn", "Adelost", "Affidelice au Chablis",
  14. "Aisy Cendre", "Allgauer Emmentaler", "Alverca",
  15. "Ami du Chambertin", "Anejo Enchilado", "Anneau
  16. "Aragon", "Ardi Gasna", "Ardrahan", "Armenian
  17. "Asadero", "Asiago", "Aubisque Pyrenees", "Autun",
  18. "Babybel", "Baguette Laonnaise", "Bakers", "Bal"};
  19. }

上面代码首先定义一个ListView类型的View对象,用来显示视图。其次使用ArrayAdapter(数组适配器)顾名思义,需要把数据放入一个数组以便显示。ListView如何显示数组中的数据呢?这就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作。数组适配器的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,有许多这样的文件,可以在OPhone目录的OPhoneSDK_1.5/platforms/android-1.5/data/res/layout下面查看),数组。同时用setAdapter()完成适配的最后工作。

SimpleCursorAdapter

SimpleCursorAdapter使用起来也是非常简单。下面以读取通讯录数据库为例加以介绍。首先为了保证列表的显示,你应该至少在通讯录中添加一个联系人作为数据库的数据。然后获得一个指向数据库的Cursor并且定义一个布局文件(当然也可以使用系统自带的)。

代码如下:

  1. public class List2 extends Activity {
  2. private ListView listView;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. listView=new ListView(this);
  7. Cursorc=getContentResolver().query(People.CONTENT_URI,
  8. null, null, null, null);
  9. startManagingCursor(c);
  10. ListAdapter adapter = new SimpleCursorAdapter(this,
  11. android.R.layout.simple_list_item_1,
  12. c,
  13. new String[] {People.NAME} ,
  14. new int[] {android.R.id.text1});
  15. listView.setAdapter(adapter);
  16. setContentView(listView);
  17. }
  18. }

在上面的ArrayAdapter里面也许读者并没有理解映射的概念,因为是系统自己做了映射。这段程序将告诉你什么是映射。首先定义用来显示的ListView对象,然后获得一个指向系统通讯录数据库的Cursor对象获得数据来源。我们将获得的Cursor对象交由Activity管理,这样Cursor的生命周期和Activity便能够自动同步,省去自己手动管理Cursor。或者使用managerQuery()方法代替query。)也可以得到同样的效果。下面要做的是将数据库数据映射到ListView实例上。需要定义SimpleCursorAdapter,他的五个参数依次为this,布局文件,Cursor实例,一个包含数据库的列的String型数组,一个包含布局文件中对应组件id的int型数组。SimpleCursorAdapter做的工作就是自动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上。上面的代码,将NAME列的数据一次映射到布局文件的id为text1的组件上。

效果如图2 所示:

上面的Ntopo,Liuzhoyun,Kun,Android,Nexus One是我添加的联系人名字。

SimpleAdapter

有图片的ListView

 

SimpleAdapter放在最后,因为它太有意思了。你能定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。在此有必要说一下ListActivity。ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

下面的例子将显示一张图片和两行文字,效果如下图3示:

首先定义一个布局文件,item.xml内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"
  6. android:orientation="horizontal">
  7. <ImageView android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. />
  11. <LinearLayout android:orientation="vertical"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. >
  15. <TextView android:id="@+id/BigText"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:textColor="#FFFFFFFF"
  19. android:textSize="30px"
  20. />
  21. <TextView android:id="@+id/LittleText"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:textColor="#FFFFFFFF"
  25. android:textSize="15px"
  26. />
  27. </LinearLayout>
  28. </LinearLayout>

java Code

  1.  
  2. public class List3 extends ListActivity {
  3. List<Map<String, Object>> list;
  4. @Override
  5. public void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. list = getListForSimpleAdapter();
  8. SimpleAdapter     adapter = new SimpleAdapter(this, list,
  9. R.layout.item,
  10. new String[] { "BigText", "LittleText", "img" },
  11. new int[] { R.id.BigText,R.id.LittleText, R.id.img });
  12. setListAdapter(adapter);
  13. }
  14. private List<Map<String, Object>> getListForSimpleAdapter() {
  15. List<Map<String,Object>> list=newArrayList<Map<String,        Object>>(3);
  16. Map<String, Object> map = new HashMap<String, Object>();
  17. map.put("BigText", "Android");
  18. map.put("LittleText", "Google phone.");
  19. map.put("img", R.drawable.n);
  20. list.add(map);
  21. map = new HashMap<String, Object>();
  22. map.put("BigText", "Lenovo");
  23. map.put("LittleText", "Ophone");
  24. map.put("img", R.drawable.o);
  25. list.add(map);
  26. map = new HashMap<String, Object>();
  27. map.put("BigText", "Droid");
  28. map.put("LittleText", "Motorola");
  29. map.put("img", R.drawable.droid);
  30. list.add(map);
  31. return list;
  32. }
  33. }

用SimpleAdapter做适配,数据来源不是一个数据库的Cursor实例,不是数组,往往是用一个有HashMap构成的List,我们在list中插入HashMap类型数据,作为数据来源。list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。有图片的ListView首先准备些图片和数据,这个工作在getListForSimpleAdapter()中完成了。因为系统没有对应的布局文件可用,我们可以自己定义一个布局item.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(item.xml),HashMap的BigText和LittleText,img。布局文件的组件id,BigText,LittleText,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

有按钮的ListView

 

但是有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。效果如下:

布局文件是在上面的item.xml里添加一个按钮:

  1. <Button android:id="@+id/bt"
  2. android:layout_height="wrap_content"
  3. android:layout_width="wrap_content"
  4. android:text="Details"
  5. android:layout_gravity="bottom|right"
  6. />
  1. public class List3 extends ListActivity {
  2. private String []phone={"Android","Lenovo","Droid"};
  3. private String []maker={"Google phone","Ophone","Motorola"};
  4. private    int[]imgid={R.drawable.n,R.drawable.o,R.drawable.droid};
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. MyAdapter adapter = new MyAdapter(this);
  9. setListAdapter(adapter);
  10. }
  11. public void sdelete(){
  12. new AlertDialog.Builder(this)
  13. .setTitle("自定义ListVeiw")
  14. .setMessage("oh,you clicked the button")
  15. .setPositiveButton("确定",
  16. new DialogInterface.OnClickListener()
  17. {
  18. publicvoid onClick(DialogInterface dialog, intwhButton)
  19. {
  20. }
  21. })
  22. .show();
  23. }
  24. public final class ViewHolder{
  25. public TextView BigText;
  26. public TextView LittleText;
  27. public ImageView img;
  28. public Button sdelete;
  29. }
  30. public class MyAdapter extends BaseAdapter
  31. {
  32. private LayoutInflater inflater;
  33. private Context mcontext=null;//assume 2 data
  34. public MyAdapter(Context context){
  35. this.mcontext=context;
  36. inflater=LayoutInflater.from(mcontext);
  37. }
  38. public int getCount() {
  39. return phone.length;
  40. }
  41. public Object getItem(int arg0) {
  42. return null;
  43. }
  44. public long getItemId(int arg0) {
  45. return 0;
  46. }
  47. public View getView(int position, View convertView,
  48. ViewGroup parent) {
  49. ViewHolder holder;
  50. if(convertView==null){
  51. convertView =inflater.inflate(R.layout.item,null);
  52. holder=new ViewHolder();
  53. holder.BigText=(TextView)convertView.findViewById(R.id.BigText
  54. );
  55. holder.LittleText=(TextView)convertView.findViewById(R.id.LittleText);
  56. holder.img=(ImageView)convertView.findViewById(R.id.img);
  57. holder.sdelete=(Button)convertView.findViewById(R.id.bt);
  58. holder.BigText.setText(phone[position]);
  59. holder.LittleText.setText(maker[position]);
  60. holder.img.setBackgroundResource(imgid[position]);
  61. convertView.setTag(holder);
  62. holder.sdelete.setOnClickListener(new Button.OnCli ckListener(){
  63. public void onClick(View arg0) {
  64. // TODO Auto-generated method stub
  65. sdelete();
  66. }
  67. });
  68. }else{
  69. holder=(ViewHolder)convertView.getTag();
  70. holder.BigText.setText(phone[position]);
  71. holder.LittleText.setText(maker[position]);
  72. holder.img.setBackgroundResource(imgid[position]);
  73. holder.sdelete.setOnClickListener(new
  74. Button.OnClickListener(){
  75. public void onClick(View v) {
  76. // TODO Auto-generated method stub
  77. sdelete();
  78. }
  79. });
  80. }
  81. return convertView;
  82. }
  83. }
  84. }

下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的item.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

作者简介:

刘照云,独立开发者。精通Java,Android编程,OPhoneSDN活跃用户账号:ntop。密切关注OPhone动向,坚决为国产系统崛起贡献一份力量。

注:该文章写的很详细,对入门和技巧开发有一定好处,特转载备忘,具体图片展示效果请参照:

http://www.ophonesdn.com/article/show/240

ListView使用详解,listActivity使用方法

时间: 2024-08-12 03:23:57

ListView使用详解,listActivity使用方法的相关文章

C# ListView用法详解

一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设置行和列之间是否显示网格线.(默认为false)提示:只有在Details视图该属性才有意义. (3)AllowColumnReorder:设置是否可拖动列标头来对改变列的顺序.(默认为false)提示:只有在Details视图该属性才有意义. (4)View:获取或设置项在控件中的显示方式,包括D

linux rm 命令详解及使用方法实战【初级】

rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就提到了rm命令,现在我们来详细介绍一下linux中删除文件和目录的命令, rm命令,rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. 名称 rm - remove files o

linux pwd 命令详解及使用方法实战【初级】

pwd:查看当前工作目录 前言: Linux中用 pwd 命令来查看”当前工作目录“的完整路径,就是经常提及的所在目录,多用在生产环境多级目录中查看当前所在路径,使用此命令能给运维人员/操作人员带来很多方便,当你不确定在什么目录下时即可直接键入此命令来进行“定位”. 上次分享的mkdir 命令详解及使用方法实战[初级]中提到过pwd当时只是简单的概括了一句,此处给大家详细讲解一下pwd使用方法,从而在将来的生产环境中更好的驾驭linux操作系统. 名称 pwd-print name of cur

linux mkdir 命令详解及使用方法实战【初级】

mkdir命令详解及使用方法实战 名称 MKDIR 是 make directories 的缩写 使用方法 mkdir [选项(如-p)] ...目录名称(及子目录注意用分隔符隔开)...    如使用mkdir建立一个多级目录则要使用-P命令 如: mkdir /lcp 是在根(/)目录下建立一个名为lcp的文件夹 mkdir -p /lcp/abc 则是在根(/)目录下建一个名为lcp的文件夹同时在此文件夹中建立名为abc的文件夹 描述 创建目录(IES),如果他们不存在. 长选项必须用的参

JSON详解+ C# String.Format格式说明+ C# ListView用法详解 很完整

JSON详解 C# String.Format格式说明 C# ListView用法详解 很完整

AIX下PVID详解及其修改方法

AIX 下 PVID 详解及其修改方法 1.PVID 是什么 PVID 全称 physical volume identifier,它非常重要,相当于软序列号,当把一个磁盘变成 PV 时, 就生成了 PVID , PVID 是由机器序列号 (uname -m的前 8位 ) 和它生成的时间组成,这种机制保证了 PVID 的唯一性.当系统启动时,磁盘配置程序会寻找磁 盘上的 PVID ,并把它跟 ODM 库中的 PVID 信息进行比 对,如果在 ODM 中找到匹配的条目,则把和这个 PVID 相对应

Android优化系列之ListView优化详解

本文内容:adapter,listview的优化,RecycleBi,n优化情况对比,google大会推荐优化, 实现ListView的过程,Adapter起到了至关重要的作用,不仅仅因为getview()方法.那么,先从Adapter说起~ Adapter: 它在ListView和数据源之间起到桥梁的作用,避免listview和数据源直接接触,而导致因为数据源的复杂性使listview显得臃肿. Adapter,适配器,把复杂的数据源适配给listview,很容易联想到适配器模式.   下面是

LVS类型详解及其调度方法

1.LVS简介 LVS 是 Linux  Virtual Server ,Linux 虚拟服务器.可以实现LINUX平台下的简单负载均衡.一般来说,LVS采用三层结构:负载调度器.服务器池.共享存储.工作在TCP/IP协议的四层,其转发是依赖于四层协议的特征进行转发的,由于其转发要 依赖于协议的特征进行转发,因此需要在内核的TCP/IP协议栈进行过滤筛选,可想而知,这就需要在内核的模块来完成,而这样的过滤转发规则又是由管理员 进行定义的,所以,LVS就是两段式的架构设计,在内核空间中工作的是"i

ListView 使用详解

在ListView中设置Selector为null会报空指针?mListView.setSelector(null);//空指针试试下面这种:mListView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 如何让ListView初始化的时候就选中一项?ListView需要在初始化好数据后,其中一项需要呈选中状态.所谓"选中状态"就是该项底色与其它项不 同,setSelection(position)只能定位到某个item,但是无