2014-2-9AdapterView及其子类1!

0.AdapterView组件是一组重要组件,AdapterView本身是一个抽象类,它派生的子类在用法上十分相似。AdapterView具有以下特征:
*AdapterView继承ViewGroup,本质是容器
【2014-2-9AdapterView及其子类1!】*AdapterView可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来
*AdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)方法设置Adapter即可。
AdapterView派生出三个子类:AbsListView、AbsSpinner和AdapterViewAnimator,这三个子类也是抽象类,实际使用时采用他们的子类。
1.列表视图(ListView)和ListActivity
ListView以垂直列表的形式显示所有列表项。有以下两种形式创建:
*直接使用ListView进行创建
*让Activity继承ListActivity(相当于该Activity显示的组件为LiestView)
获得ListView后,就要为ListView设置它要显示的列表项。ListView表显示出AdapterView的特征:通过setAdapter(Adapte)方法为之提供Adapter、并由Adapter提供列表项。
实例:ListView
Xml代码清单


PS:android:entries指定了列表项数组,android:divider改变列表项之间的分隔条。
android:entries="@array/books",该属性用了数组资源,所以需定义一个books数组:
arrays.xml

如何阅读一本书 理想丰满 拆掉思维的墙 正能量 遇见未知的自己 做最好的自己

2014-2-9AdapterView及其子类1!
文章图片


2.Adapter接口及实现类
Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。
在这两个类之下还有许多继承类,其常用实现类有:
*ArrayDapter:简单易用的Adapter,常用于数组或List集合的多个值包装成多个列表项
*SimpleAdapter:功能强大,用于将List集合的多个对象包装成多个列表项
*SimpleCursorAdapter:与SimpleAdapter相似,用于包装Cursor提供的数据
*BaseAdapter:常用于被扩展,可以对个列表项进行最大限度的定制
实例:用ArrayAdapter创建ListView
XML代码清单


Java代码清单

packagecom.hqsA.arrayadaptert; importandroid.os.Bundle; importandroid.widget.ArrayAdapter; importandroid.widget.ListView; importandroid.app.Activity; public classArrayAdapterT extends Activity { @Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.array_adapter_t); ListView list1 = (ListView) findViewById(R.id.list1); //定义一个数组 String[] arr1 = {"中兴", "华为","酷派", "联想"}; //将数组包装为ArrayAdapter ArrayAdapter adapter1 =new ArrayAdapter (this,R.layout.array_item, arr1); //为ListView设置Adapter list1.setAdapter(adapter1); ListView list2 = (ListView)findViewById(R.id.list2); //定义一个数组 String[] arr2 = {"ZTE" ,"Huawei" , "Lenovo" , "Coolpad"}; //将数组包装为ArrayAdapter ArrayAdapter adapter2 =new ArrayAdapter (this,R.layout.checked_item, arr2); //为ListView设置Adapter list2.setAdapter(adapter2); } }

Ps:创建ArrayAdapter时必须指定三个参数:
*Context:它代表访问整个Android应用的接口,几乎创建所有组件都需要传入Context对象
*textViewResourceld:资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件
*数组或List:该数组或List为多个列表项提供数据
Array_item.xml代码清单


Check_item.xml布局文件与上面相似
效果:
2014-2-9AdapterView及其子类1!
文章图片

3.使用SimpleAdapter创建ListView
实例:
Xml代码清单


Java代码清单

public class SimpleAdapterT extends Activity { private String[] names = new String[] {"虎头", "弄玉" , "李清照" , "李白"}; private String[] descs = new String[] {"可爱的小孩" , "一个擅长音乐的女孩" , "一个擅长文学的女性" , "浪漫主义诗人"}; private int[] imageIds = new int[] {R.drawable.tiger , R.drawable.nongyu , R.drawable.qingzhao , R.drawable.libai}; @Override protected void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_adapter_t); //创建一个List集合,List集合的元素是Map ListlistItems= new ArrayList(); for(int i = 0 ; i < names.length ; i++) { Map listItem=new HashMap(); listItem.put("header", imageIds[i]); listItem.put("personName", names[i]); listItem.put("desc", descs[i]); listItems.add(listItem); } //创建一个SimpleAdapter SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.simple_item, new String[]{"personName", "header", "desc"}, new int[]{R.id.name, R.id.header, R.id.desc}); ListView list = (ListView)findViewById(R.id.mylist); //为ListView设置Adapter list.setAdapter(simpleAdapter); } }

PS:创建Simple对象需要5个参数,4个关键参数为:
第2个参数:该参数应为一个List类型的集合对象,该集合中每个Map对象生成一个列表项
第3个参数:该参数指定一个布局界面ID。布局界面里定义组件来显示列表项。
第4个参数:该参数是一个String[]类型的参数,该参数决定提取Map对象中的哪些key对应的value来生成列表项
第5个参数:int[]类型的参数,决定填充哪些组件。
Simple_item对应布局文件代码:


2014-2-9AdapterView及其子类1!
文章图片

为上面Activity中的ListView绑定事件监听器:

//为ListView的列表项的单击事件绑定事件监听器 list.setOnItemClickListener(new OnItemClickListener() { //第position项被单击时激发该方法 @Override public void onItemClick(AdapterView parent,View view, int position, long id) { System.out.println(names[position] + "被单击了"); } }); //为ListView的列表项的选中事件绑定事件监听器 list.setOnItemSelectedListener(new OnItemSelectedListener() { //第position项被选中时激发该方法 @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { System.out.println(names[position] + "被选中了"); } @Override public void onNothingSelected(AdapterView parent) {} });

运行效果:
2014-2-9AdapterView及其子类1!
文章图片

*PS:选中事件无法发生,只有单击事件可以正常运行,不知道原因,可能是事件监听器的问题,以后要查找原因!
4.扩展BaseAdapter实现ListView
Xml代码清单


JAVA代码清单

public class BaseAdapterT extends Activity { ListView mylist; @Override protected voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.base_adapter_t); mylist = (ListView) findViewById(R.id.mylist); BaseAdapter adapter = new BaseAdapter() { @Override public int getCount() { //指定一共包含40个选项 return 40; } @Override public Object getItem(int position) { return null; } //重写该方法,该方法的返回值将作为列表项的ID @Override public long getItemId(int position) { return position; } //重写该方法,该方法返回的view将作为列表框 @Override public View getView(int position, View convertView , ViewGroup parent) { //创建一个LinearLayout,并向其中添加两个组件 LinearLayout line = new LinearLayout(BaseAdapterT.this); line.setOrientation(0); ImageView image = new ImageView(BaseAdapterT.this); image.setImageResource(R.drawable.ic_launcher); TextView text = new TextView(BaseAdapterT.this); text.setText("第" + (position +1) + "个列表项"); text.setTextSize(20); text.setTextColor(Color.RED); line.addView(image); line.addView(text); //返回LinearLayout实例 return line; } }; mylist.setAdapter(adapter); } }


2014-2-9AdapterView及其子类1!
文章图片


PS:创建一个BaseAdapter对象,需要重写如下4个方法:
*getCount():返回值控制该Adapter将会包含多少个列表项
*getItem(int position):该方法的返回值决定第position处的列表项内容
*getItemId(int position):该方法返回值决定第position处的列表项ID
*getView(int position, View convertView,ViewGroup parent):该方法的返回值决定第position处的列表项组件
创建Adapter的四种方法:
(1).ArrayAdapter(2).基于ListView实现
(3).SimpleAdapter(4).BaseAdapter

    推荐阅读