Android开发指南中文版(十四)User InterfaceBinding to Data with AdapterView

AdapterView是ViewGroup的子类,他的子View由一个绑定了某种数据类型的适配器(Adapter)来决定。当你需要在你的布局中显示存储的数据(不同于资源字符串或绘图资源)时,AdapterView 就非常有用。

Gallery, ListView, 和 Spinner是AdapterView 的一个示例子类,你可以用来绑定指定类型的数据并且以某种方式显示。

AdapterView 对象有两个主要职责:

  • 用数据填充布局
  • 处理用户的选取

用数据填充布局(Filling the Layout with Data)

把数据插入布局的典型做法是把AdapterView类绑定到一个适配器(Adapter)上,适配器会从外部源(可能是代码中的一个list或者设备数据库的查询结果)检索数据。

下面的示例代码做如下事情:

  1. 同一个已经存在的View一起,创建一个 Spinner对象, 并且把它绑定到一个新的ArrayAdapter 对象上, 该适配器对象从本地资源中读取一组颜色值。
  2. 从一个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);
原文地址:https://www.cnblogs.com/blueofsky/p/2321246.html