Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)

来源:互联网 发布:软件开发协议书范本 编辑:程序博客网 时间:2024/06/03 19:38
 

Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)-更新20130912


概述

              AdapterView继承了ViewGroup,它的本质是容器
              AdapterView 可以包含多个 “列表项”,并将多个“列表项”以合适的形式显示出来
              AdapterView显示的多个“列表项”由Adapter提供

类图



ListView(列表视图)

ListView以垂直列表的形式显示所有列表项

创建方式:

                          1、直接使用ListView创建
                          2、让Activity继承ListActivity(相当于该Activity显示的组件为ListView)
在程序中获得了ListView之后,接下来就需要为ListView设置它要显示的列表项
注释:ListView、GridView、Spinner、Gallery等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项

XML属性

AbsListView属性
官方API参考
http://developer.android.com/reference/android/widget/AbsListView.html

XML属性相关方法说明android:choiceMode 设置AbsListView的选择行为,支持下列属性值
none:不显示任何选中项 value=0
singleChoice:允许单选 value=1
multipleChoice:允许多选 value=2
multipleChoiceModal:允许多选 value=3android:DrawSelectorOnTopsetDrawSelectoronTop(boolean)true:选中的列项将会显示在上面android:fastScrollEnabled 设置是否允许快速滚动
true:显示滚动图标,并允许用户拖动该滚动图标进行快速滚动android:listSelectorsetSelector(int)指定被选中的列表项上绘制的Drawableandroid:scrollingCache true:该组件在滚动时将会使用绘制缓存android:smoothScrollbarsetSmoothScrollbarEnable(boolean)false:则不在header View之后绘制分割线android:stackFromBottom 设置是否从底端开始排列列表项android:textFilterEnable 设置是否对列表项进行过滤
注释:当该AbsListView对应的Adapter实现了Filter接口时该属性才会起作用android:transcriptMode 设置该组件的滚动模式。该属性支持如下属性
disabled:关闭滚动。默认值
normal:当该AbsListView受到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端
alwaysScroll:该AbsListView总会自动滚动到底端
ListView常用XML属性
android:divider设置List列表项的分割线(即可用颜色分割,也可用Drawable分割)android:dividerHeight分割线的高度android:entries指定一个数组资源,Android将根据该数组资源来生成ListViewandroid:footerDividersEnabledfalse:则不在footer View之前绘制分隔线android:headerDividersEnabledfalse:则不在header View之后绘制分隔线

使用数组创建ListView实例

Android_ListView/res/layout/activity_main.xml
[html] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:orientation="vertical"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.  >  
  6.     <!-- 使用数组资源给出列表项 -->  
  7.     <ListView   
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:entries="@array/code"  
  11.         android:divider="#f00"  
  12.         android:dividerHeight="2dp"  
  13.         android:headerDividersEnabled="false"  
  14.         />  
  15. </LinearLayout>  

Android_ListView/res/values/arrays.xml
[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <resources>  
  3.     <string-array name="code">  
  4.         <item>Android</item>  
  5.         <item>PHP</item>  
  6.         <item>Java</item>  
  7.         <item>C</item>  
  8.         <item>C++</item>  
  9.     </string-array>  
  10. </resources>  


调试效果
这是一个比较简单的案例,这种方式创建ListView能定制的内容很少


Adapter(接口)

     Adapter本身只是一个接口
     它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项

接口及其实现类的继承关系类图

    接口间接类较多,可能画的有点凌乱,我整理了很几次,看着也好像有点凌乱,呵呵。凑活着看吧
    官方API参考:
   http://developer.android.com/reference/android/widget/Adapter.html

Adapter常用的实现类

1、ArrrayAdapter:简单、易用,通常用于数组或List集合的多个值包装成多个列表项
2、SimpleAdapter:功能有点强,可用于将List集合的多个对象包装成多个列表项
3、SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据
4、BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制

实现类一:ArrayAdapter实例

    设计场景:通过界面布局定义两个ListView,但这两个ListView都不指定android:entries属性(哈哈,区别来啦,前面一个简单例子,我们是通过配置XML数组资源)
                        我们通过Activity为两个ListView提供Adapter,Adapter来控制所显示的列表项
                        注释:这个有点像WEB开发的模板机制,定义好数据格式后,通过后端程序来控制数据资源需要显示的内容。
    Android_ListView/layout/Activity_main.xml
    
[html] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:orientation="vertical"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.  >  
  6.     <!-- 定义两个ListView -->  
  7.     <ListView   
  8.         android:id="@+id/list01"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:divider="#f00"  
  12.         android:dividerHeight="2dp"  
  13.         android:headerDividersEnabled="false"  
  14.         />  
  15.     <ListView   
  16.         android:id="@+id/list02"  
  17.         android:layout_width="fill_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:divider="#f00"  
  20.         android:dividerHeight="2dp"  
  21.         android:headerDividersEnabled="false"  
  22.         />  
  23. </LinearLayout>  
 Android_ListView/res/layout/array_item.xml
[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <TextView  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:id="@+id/TextView"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="wrap_content"  
  7.     android:textSize="24sp"  
  8.     android:padding="10dp"  
  9.     android:shadowColor="#f0f"  
  10.     android:shadowDx="4"  
  11.     android:shadowDy="4"  
  12.     android:shadowRadius="2"  
  13.     />  

Android_ListView/res/layout/checked_item.xml
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <CheckedTextView  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:id="@+id/TextView"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="wrap_content"      
  7.     android:textSize="24sp"  
  8.     android:checkMark="@drawable/ok"  
  9.     android:shadowColor="#f0f"  
  10.     android:shadowDx="4"  
  11.     android:shadowDy="4"  
  12.     android:shadowRadius="2"/>  

Android_ListView/src/com/example/android_listview/MianActiviy.java
[java] view plaincopy
  1. package com.example.android_listview;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6. import android.widget.ArrayAdapter;  
  7. import android.widget.ListView;  
  8.   
  9. public class MainActivity extends Activity {  
  10.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.activity_main);  
  15.         ListView list01 = (ListView) findViewById(R.id.list01);  
  16.         ListView list02 = (ListView) findViewById(R.id.list02);  
  17.         //定义数组  
  18.         String[] data1 = {"屌丝","高富帅","白富美"};  
  19.         String[] data2 = {"Android","PHP","Java","C","C++"};  
  20.           
  21.         //将数组包装为ArrayAdapter  
  22.         ArrayAdapter<String> adapter1 = new ArrayAdapter<String>  
  23.         (this,R.layout.array_item,data1);  
  24.         ArrayAdapter<String> adapter2 = new ArrayAdapter<String>  
  25.         (this,R.layout.checked_item,data2);  
  26.           
  27.         //为ListView 设置 Adapter  
  28.         list01.setAdapter(adapter1);  
  29.         list02.setAdapter(adapter2);  
  30.     }  
  31.   
  32.     @Override  
  33.     public boolean onCreateOptionsMenu(Menu menu) {  
  34.         // Inflate the menu; this adds items to the action bar if it is present.  
  35.         getMenuInflater().inflate(R.menu.main, menu);  
  36.         return true;  
  37.     }  
  38.   
  39. }  

调试效果
 知识点:
              ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
(this,R.layout.array_item,data1)
             创建ArrayAdapter时必须指定的三个参数:
             1、Context:代表了访问整个Android应用的接口。
             2、textViewResourceld:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件
             3、数组或List:该数组或List将负责为多个列表项提供数据

ListActivity实现列表

如果窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无需调用setContentView()方法来显示某个界面
而是可以直接传入一个内容Adapter,ListActivity子类就呈现出一个列表

Android_ListView/src/com/example/android_listview/MianActiviy.java
[java] view plaincopy
  1. package com.example.android_listview;  
  2.   
  3. import android.app.ListActivity;  
  4. import android.os.Bundle;  
  5. import android.widget.ArrayAdapter;  
  6.   
  7. /** 
  8.  * @author  LiuxinMing 1235355@qq.com 
  9.  */  
  10. public class MainActivity extends ListActivity  
  11. {  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState)  
  14.     {  
  15.         super.onCreate(savedInstanceState);  
  16.         // 无需使用布局文件  
  17.         String[] arr = {"屌丝","高富帅","白富美"};  
  18.         // 创建ArrayAdapter对象  
  19.         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  
  20.             android.R.layout.simple_list_item_multiple_choice, arr);  
  21.         // 设置该窗口显示列表  
  22.         setListAdapter(adapter);  
  23.     }  
  24. }  

调试效果:


实现类二:SimpleAdapter创建ListView

实现步骤

                 1、先在界面布局中定义一个ListVew(该ListView将会显示由SimpleAdapter提供的列表项)
                 2、创建一个list集合(可选)
                 3、创建SimpleAdapter
                 4、为ListView设置Adapter
Android_SimpleAdapter/res/layout/activity_main.xml
[html] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:orientation="horizontal"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     >  
  6.     <!-- 定义一个ListView -->  
  7.     <ListView   
  8.         android:id="@+id/list01"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         />  
  12. </LinearLayout>  

Android_SimpleAdatper/res/layout/simple_item.xml
[html] view plaincopy
  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="match_parent"  
  5.     android:layout_height="wrap_content"  
  6.     >  
  7.     <!-- 定义一个ImageView,用于作为列表项的一部分 -->  
  8.     <ImageView android:id="@+id/header"  
  9.         android:layout_width="100dp"  
  10.         android:layout_height="100dp"  
  11.         android:scaleType="centerCrop"  
  12.         android:paddingLeft="10dp"  
  13.         />  
  14.     <LinearLayout   
  15.         android:orientation="vertical"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content"  
  18.         >  
  19.         <!-- 定义一个TextView,用于作为列表项的一部分 -->  
  20.         <TextView android:id="@+id/name"  
  21.             android:layout_width="wrap_content"  
  22.             android:layout_height="wrap_content"  
  23.             android:textSize="20dp"  
  24.             android:textColor="#f0f"  
  25.             android:paddingLeft="10dp"  
  26.             />  
  27.         <!-- 定义一个TextView,用于作为列表项的一部分 -->  
  28.         <TextView android:id="@+id/desc"  
  29.             android:layout_width="wrap_content"  
  30.             android:layout_height="wrap_content"  
  31.             android:textSize="14dp"  
  32.             android:paddingLeft="10dp"  
  33.             />  
  34.     </LinearLayout>  
  35. </LinearLayout>  

activity代码
[java] view plaincopy
  1. package com.example.android_simpleadapter;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.os.Bundle;  
  9. import android.app.Activity;  
  10. import android.util.Log;  
  11. import android.view.Menu;  
  12. import android.view.View;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.ListView;  
  17. import android.widget.SimpleAdapter;  
  18.   
  19. public class MainActivity extends Activity {  
  20.     private String tag = "SimpleAdapterActivity";  
  21.     private String[] names = new String[]  
  22.             {  
  23.                 "觉悟",  
  24.                 "学习",  
  25.                 "能力"  
  26.             };  
  27.     private String[] descs =  new String[]  
  28.             {  
  29.                 "对工作生活的觉悟",  
  30.                 "对新鲜事物的认知能力",  
  31.                 "对学习的掌握能力"  
  32.             };  
  33.     private int[] imageId = new int[]  
  34.             {  
  35.                 R.drawable.consciousness,  
  36.                 R.drawable.learn,  
  37.                 R.drawable.ability  
  38.             };  
  39.     @Override  
  40.     protected void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.activity_main);  
  43.         //创建一个List集合,List集合的元素是Map  
  44.         List<Map<String,Object>> listItems =   
  45.                 new ArrayList<Map<String,Object>>();  
  46.         for (int i=0; i<names.length;i++)  
  47.         {  
  48.             Map<String,Object> listItem = new HashMap<String,Object>();  
  49.             listItem.put("header", imageId[i]);  
  50.             listItem.put("personName", names[i]);  
  51.             listItem.put("desc", descs[i]);  
  52.             listItems.add(listItem);  
  53.         }  
  54.         //创建一个 SimpleAdapter  
  55.         SimpleAdapter simpleAdapter = new SimpleAdapter(this,listItems,  
  56.                 R.layout.simple_item,  
  57.                 new String[] {"personName","header","desc"},  
  58.                 new int[] {R.id.name,R.id.header,R.id.desc}  
  59.                 );  
  60.         ListView list = (ListView) findViewById(R.id.list01);  
  61.         //为ListView 设置Adapter  
  62.         list.setAdapter(simpleAdapter);  
  63.         //为ListView的列表项的点击事件绑定事件监听器  
  64.         list.setOnItemClickListener(new OnItemClickListener()  
  65.         {  
  66.   
  67.             @Override  
  68.             public void onItemClick(AdapterView<?> parent, View view, int position,  
  69.                     long id) {  
  70.                 // TODO Auto-generated method stub  
  71.                  Log.d(tag, names[position]+"被单击了");    
  72.             }  
  73.               
  74.         });           
  75.     }  
  76.   
  77.     @Override  
  78.     public boolean onCreateOptionsMenu(Menu menu) {  
  79.         // Inflate the menu; this adds items to the action bar if it is present.  
  80.         getMenuInflater().inflate(R.menu.main, menu);  
  81.         return true;  
  82.     }  
  83.   
  84. }  


知识点:
SimpleAdapter对象,它需要5个参数
第二个参数:该参数应该是一个List<? extends Map<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项
第三个参数:该参数指定一个界面布局的ID。
第四个参数:该参数应该是一个String[]类型的参数,该参数决定提取Map<String,?>对象中那些key对应的value来生产列表项。
第五个参数:该参数应该是一个int[] 类型的参数,该参数决定填充那些组件
藏上面的代码看,listItems是一个长度为4的集合,这意味着它生产的ListView将会包含4个列表项,每个列表项都是R.layout.simple_item对应的组件。组件内容由listItems集合提供。
调试效果


绑定的单击事件,我们看下日志(刚才我们绑定了列表项单击事件,并单击后输出log)



实现类四:BaseAdapter

扩展BaseAdapter可以取得对Adapter最大的控制权:程序要创建多少个列表项,每个列表项的组件都由开发者来决定。
比较自由
扩展该对象需要重写如下4个方法:
1、getCount():该方法的返回控制该Adapter将会包含多少个列表项
2、getItem(int position):该方法的返回值决定第position处的列表项的内容
3、getItemId(int position):该方法的返回值决定第position处的列表项的ID
4、getView(it position,View convertView,viewGroup parent):该方法的返回值决定第position处的列表项组件
0 1
原创粉丝点击