0. AdapterView组件是一组重要组件,AdapterView本身是一个抽象类,它派生的子类在用法上十分相似。AdapterView具有以下特征:
*AdapterView继承ViewGroup,本质是容器
*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
- 如何阅读一本书
- 理想丰满
- 拆掉思维的墙
- 正能量
- 遇见未知的自己
- 做最好的自己
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布局文件与上面相似
效果:
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
List
PS:创建Simple对象需要5个参数,4个关键参数为:
第2个参数:该参数应为一个List>类型的集合对象,该集合中每个Map
第3个参数:该参数指定一个布局界面ID。布局界面里定义组件来显示列表项。
第4个参数:该参数是一个String[]类型的参数,该参数决定提取Map
第5个参数:int[]类型的参数,决定填充哪些组件。
Simple_item对应布局文件代码:
为上面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) {
}
});
运行效果:
*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);
}
}
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