AdapterView
是ViewGroup的子类,他的子View由一个绑定了某种数据类型的适配器(Adapter)
来决定。当你需要在你的布局中显示存储的数据(不同于资源字符串或绘图资源)时,AdapterView 就非常有用。
Gallery
, ListView
, 和 Spinner
是AdapterView 的一个示例子类,你可以用来绑定指定类型的数据并且以某种方式显示。
AdapterView 对象有两个主要职责:
- 用数据填充布局
- 处理用户的选取
用数据填充布局(Filling the Layout with Data)
把数据插入布局的典型做法是把AdapterView类绑定到一个适配器(Adapter)
上,适配器会从外部源(可能是代码中的一个list或者设备数据库的查询结果)检索数据。
下面的示例代码做如下事情:
- 同一个已经存在的View一起,创建一个
Spinner
对象, 并且把它绑定到一个新的ArrayAdapter 对象上, 该适配器对象从本地资源中读取一组颜色值。 - 从一个View中创建另外一个 Spinner 对象,并且把它绑定到一个新的SimpleCursorAdapter 对象上,该适配器将从设备中上联系人中读取人名(参看
Contacts.People
章节)。
// 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.setDropDownViewResourc(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.setDropDownViewResourc(android.R.layout.simple_spinner_dropdown_item); s2.setAdapter(adapter2);
注意,在此必须含有People._ID字段,该字段同 CursorAdapter 处于映射使用中,否则你将会得到一个异常。
如果,在你的应用的生命周期中,你变更了正在被你的适配器读取的数据,你应该调用notifyDataSetChanged()
方法。该方法将会通知附属的View,其数据已经改变并且他们需要更新自己。
处理用户的选取(Handling User Selections)
要处理用户的选取事件,可以通过设置类的AdapterView.OnItemClickListener
成员来监听和捕获变更的选择。
// 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);