AdapterView是ViewGroup的一个子类,它的子View是由绑定某些类型数据的Adapter类决定的。AdapterView有助于在需要的时候,在布局中显示被存储的数据(相对与资源字符串或可描画资源)。
Gallery、ListView和Spinner是AdapterView子类的例子,你能够使用它们绑定特定类型的数据,并且用某种方法显示它。
AdapterView对象有两个主要的职责:
1. 用数据填充布局
2. 处理用户的选择
用数据填充布局
通常,通过把AdapterView类绑定到一个Apater类把数据插入到布局中,Adapter从一个外部资源中获取数据(可能是由代码提供的一个数据列表,也可能是来自设备数据库中的一个查询结果)。
以下代码演示了填充数据的方法:
1. 创建一个既存的Spinner对象,并且把它绑定到一个新的ArrayAdapter对象,ArrayAdater对象从本地资源中读取颜色数组;
2. 创建另外一个Spinner对象,并且把它绑定到一个SimpleCursorAdapter对象,SimpleCursorAdapter从设备的通信录中读取人的名字。
// Get a Spinner and bind it to an ArrayAdapter that
// references a String array.
Spinner s1 = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter adapter = ArrayAdapter.createFromResource(
this, R.array.colors, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s1.setAdapter(adapter);
// Load a Spinner and bind it to a data query.
private static String[] PROJECTION = new String[] {
People._ID, People.NAME
};
Spinner s2 = (Spinner) findViewById(R.id.spinner2);
Cursor cur = managedQuery(People.CONTENT_URI, PROJECTION, null, null);
SimpleCursorAdapter adapter2 = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_item, // Use a template
// that displays a
// text view
cur, // Give the cursor to the list adapter
new String[] {People.NAME}, // Map the NAME column in the
// people database to...
new int[] {android.R.id.text1}); // The "text1" view defined in
// the XML template
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s2.setAdapter(adapter2);
注意,CursorAdapter对象使用字段映射中必须要有一个People._ID列,否则会发生异常。
如果在应用程序的生存期间,由Adapter读取的数据发生了改变,就应该调用notifyDataSetChanged()方法,这样就会通知被绑定的View,数据已经发生了改变,View应该刷新自己。
处理用户选择
通过把类的AdapterView.OnItemClicListener成员设置给一个监听器,就可以处理用户的选择,并且捕获选择的改变。如:
// Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id)
{
// Display a messagebox.
Toast.makeText(mContext,"You've got an event",Toast.LENGTH_SHORT).show();
}
};
// Now hook into our object and set its onItemClickListener member
// to our class handler object.
mHistoryView = (ListView)findViewById(R.id.history);
mHistoryView.setOnItemClickListener(mMessageClickedHandler);