Android学习笔记(五)常用控件中

一、废话

  最近很久都没有更新了,主要是由于之前在准备一个面试,以及现在年终了,有一些事情挺繁琐的耽搁了不少时间。下面开始正文。这篇笔记的主要内容是Adapter以及ListView控件。

二、正文

  1、Adapter

    a)  在介绍ListView之前,先要介绍下Adapter类。这个类为我们在ListView、Spinner、Gallery以及GridView等控件与原始数据建搭建了一个交换的桥梁。从这个类下派生出来的类,比如:BaseAdapter、SimpleAdapter,都是我们以后会经常使用到的类。

    b)  根据帮助文档的(android-sdk-windows\docs\reference\android\widget\ListAdapter.html和BaseAdapter.html)文件中,我们可以知道下面的几个信息:

      i.  BaseAdapter 是一个抽象类,如果要自定义一个Adapter,那么需要继承这个类并实现里面的方法。同时它也实现了ListAdapter和SpinnerAdapter接口,所以只要扩展自该类的子类,都是可以为ListView或者Spinner等控件提供数据支持的。所以当你有特殊需求时,继承这个类是一个非常不错的选择。

      ii.  ArrayAdapter 继承自BaseAdapter,支持泛型操作。

      iii.  SimpleAdapter 是一个系统已经实现好的类,主要用作把我们在XML文件中定义好的静态数据呈现在UI上。在下面的例子中,将使用到这个类。

      iv.  更多的关于Adapter的情况,可以在帮助文档中得到详细信息。

  2、简单的ListView

    a)  ListView是啥?

       它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。在Android中是非常重要的数据列表显示控件,包括我们的电话薄、电话记录等都有使用到ListView控件。

    b)  ListView显示的四个步骤一般为:

      i.    定义每个子项(Item)的样式。

      ii.   定义数据源,也就是我们要显示的文字、图片或者其他一些信息。

      iii.  定义适配器,并为其指定数据(如何把数据映射到ListView中)。

      iv.  为ListView控件绑定适配器。

    c)  下面我们来实现一个如图所示的ListView:

      i.  定义子项Item样式。

       在res/Layout文件夹下,新建一个XML文件,取名user.xml。

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="horizontal"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     android:paddingLeft="10dip"
 7     android:paddingRight="10dip"
 8     android:paddingTop="1dip"
 9     android:paddingBottom="1dip"
10 >
11 <TextView  
12 android:layout_width="180dip" 
13     android:layout_height="30dip" 
14     android:id="@+id/user_name"
15     android:textSize="10pt"
16     android:singleLine="true"
17 />
18 <TextView  
19 android:layout_width="fill_parent" 
20     android:layout_height="fill_parent" 
21     android:id="@+id/user_ip"
22     android:gravity="right"
23     android:textSize="10pt"
24 />
25 </LinearLayout>
复制代码

      ii.  定义数据源。

复制代码
 1         ArrayList<HashMap<String,String>> list=new  ArrayList<HashMap<String,String>>();
 2         HashMap<String,String> map1=new HashMap<String,String>();
 3         HashMap<String,String> map2=new HashMap<String,String>();
 4         HashMap<String,String> map3=new HashMap<String,String>();
 5         map1.put("user_name","LiMing");
 6         map1.put("user_ip", "172.18.71.1");
 7         map2.put("user_name", "Zhang");
 8         map2.put("user_ip","172.18.71.2");
 9         map3.put("user_name","Deng");
10         map3.put("user_ip","172.18.71.3");
11         list.add(map1);
12         list.add(map2);
13         list.add(map3);
复制代码

      iii.  定义适配器。

复制代码
        /*this——适配器的上下文参数
         *list——数据源
         *R.layout.*——ListView的子项模式
         *new String[]{*,*}——在数据源list中对应的绑定项
         *new int[]{*,*}——ListView子项中对应的TextView的ID号,这个必须和前一个new String[]{*,*}中的参数对应,否则绑定将失败
         */
        SimpleAdapter listAdapter = new SimpleAdapter(this,list,R.layout.user, new String[]{"user_name","user_ip"}, new int[]{R.id.user_name,R.id.user_ip});
复制代码

      iv. 为ListView控件绑定适配器。

        //setListAdapter()方法是ListActivity中自带的一个方法,因此可以直接调用
        setListAdapter(listAdapter);

    d)  最后说明一点,通常情况下,可以直接让我们新建的Activity继承自ListActivity,这样可以使用Android系统为我们提供的ListView的布局方式,但是这个时候我们必须确保在我们定义的布局文件中必须有ID为android:list的ListView控件。具体的请有兴趣的同学在下载源码后,注意查看我们具体继承的是哪一个类,以及我们的res/layout/main.xml文件中ListView控件的ID是如何定义的。

  3、稍微复杂的ListView并响应用户事件

      下面来实现一个稍微要复杂一点点的ListView显示。有图有真相,所以直接上图。

      在这个例子中,将要实现一个点击某项后,会显示选中栏目ID的事件,并在长按某项后弹出菜单的一个功能。

      还是按照先前的步骤来。

      i.  定义子项Item样式。

         在res/Layout文件夹下,新建一个XML文件,取名subItem.xml。

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout 
 3 android:id="@+id/RelativeLayout01" 
 4     android:layout_width="fill_parent" 
 5     xmlns:android="http://schemas.android.com/apk/res/android" 
 6     android:layout_height="wrap_content" 
 7     android:paddingBottom="4dip" 
 8     android:paddingLeft="12dip"
 9     android:paddingRight="12dip">
10 <ImageView 
11 android:paddingTop="12dip"
12     android:layout_alignParentRight="true"
13     android:layout_width="wrap_content" 
14     android:layout_height="wrap_content" 
15     android:id="@+id/ItemImage"
16 /> 
17 <TextView 
18 android:text="TextView01" 
19     android:layout_height="wrap_content" 
20     android:textSize="20dip" 
21     android:layout_width="fill_parent" 
22     android:id="@+id/ItemTitle"
23 />
24 <TextView 
25 android:text="TextView02" 
26     android:layout_height="wrap_content" 
27     android:layout_width="fill_parent" 
28     android:layout_below="@+id/ItemTitle" 
29     android:id="@+id/ItemText"
30 />
31 </RelativeLayout>

      ii.  定义数据源。

复制代码
 1         //生成动态数组,加入数据
 2         ArrayList<HashMap<String, Object>> listItem 
 3             = new ArrayList<HashMap<String, Object>>();
 4         for(int i=0;i<10;i++)
 5         {
 6             HashMap<String, Object> map = new HashMap<String, Object>();
 7             map.put("ItemImage", R.drawable.hmenuunlock);//图像资源的ID
 8             map.put("ItemTitle", "Level "+i);
 9             map.put("ItemText", "Finished in 1 Min 54 Secs, 70 Moves! ");
10             listItem.add(map);
11         }
复制代码

      iii. 定义适配器。

复制代码
1   //生成适配器的Item和动态数组对应的元素
2         SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//数据源 
3             R.layout.list_items,//ListItem的XML实现
4             //动态数组与ImageItem对应的子项        
5             new String[] {"ItemImage","ItemTitle", "ItemText"}, 
6             //ImageItem的XML文件里面的一个ImageView,两个TextView ID
7             new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
8         );
复制代码

      iv. 为ListView控件绑定适配器。

1         //绑定Layout里面的ListView
2         ListView list = (ListView) findViewById(R.id.ListView01);
3         //绑定Adapter
4         list.setAdapter(listItemAdapter);

      v. 响应选中事件

复制代码
1         //添加点击
2         list.setOnItemClickListener(new OnItemClickListener() {
3             @Override
4             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
5                 setTitle("点击第"+arg2+"个项目");
6             }
7         });
复制代码

      vi. 响应长按事件

复制代码
1       //添加长按点击
2         list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {            
3             @Override
4             public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
5                 menu.setHeaderTitle("长按菜单-ContextMenu");   
6                 menu.add(0, 0, 0, "弹出长按菜单0");
7                 menu.add(0, 1, 0, "弹出长按菜单1");   
8             }
9         });
复制代码

      vii.响应弹出菜单点击事件

1     //长按菜单响应函数
2     @Override
3     public boolean onContextItemSelected(MenuItem item) {
4         setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目"); 
5         return super.onContextItemSelected(item);
6     }

    到此,一个非常简单的ListView呈现数据的应用程序就搞定了。再次回顾下如何使用Adapter来为ListView这样的控件提供数据。

      i.   定义你的数据的源,并使用List<T>类型来包装你的数据。

      ii.  定义好的你的数据呈现方式,也就是定义好ListItem.xml。

      iii.  将定义好的数据和ListItem.xml进行绑定。

    对于Adapter的机制和如果扩展,我想在把主要的几个控件讲完后再来仔细说明。下面说说Spinner控件。

  4、Spinner

      a)  啥是Spinner?

        类似DropdownList控件,用来响应用户选择子项。

      b)  Spinner显示的四个步骤一般为:

        i.    定义每个子项(Item)的样式。

        ii.   定义数据源,也就是我们要显示的文字、图片或者其他一些信息。

        iii.  定义适配器,并为其指定数据(如何把数据映射到View中)。

        iv.  为Spinner控件绑定适配器。

      是的,你肯定已经发现了,这个控件的绑定过程和我们的ListView一模一样的。代码什么的全部就放在Demo源码中了,不浪费篇幅了。今天时间有限,所以只能先到这里了。明天到成都,希望能够有时间能够继续完成Gallery和GridView这两个控件的介绍。

三、总结

  至此,通过上面的三个例子,应该对SimpleAdapter的使用,ListView控件绑定的各个环节都有了个比较清楚的影响,那么如果需要使用更加灵活的Adapter该怎么办呢?应该在下面的笔记六中会介绍到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值