ITEEDU

SimpleCursorTreeAdapter示例

使用SimpleCursorTreeAdapter和ExpandableListActivity完成联系人列表,点击后显示其号码。

AppMainAcitivity

public class AppMainAcitivity extends ExpandableListActivity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 查询联系人并获取其Cursor对象
		Cursor groupCursor = managedQuery(
				ContactsContract.Contacts.CONTENT_URI, new String[] {
						ContactsContract.Contacts._ID,
						ContactsContract.Contacts.DISPLAY_NAME },
						null, 
						null,
						null);

		// 保存取联系人ID的列位置
		mGroupIdColumnIndex = groupCursor
				.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
		//设置 adapter
		MyExpandableListAdapter mAdapter = new MyExpandableListAdapter(
				groupCursor,
				this,
				android.R.layout.simple_expandable_list_item_1,//组视图(联系人)
				android.R.layout.simple_expandable_list_item_1,//子视图(电话号码)
				new String[] { ContactsContract.Contacts.DISPLAY_NAME }, //显示联系人名字
				new int[] { android.R.id.text1 },
				new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }, //显示电话号码
				new int[] { android.R.id.text1 });
		setListAdapter(mAdapter);
	}

	/**
	 * 
	 * 因为SimpleCursorTreeAdapter是抽象类,所以我们要继承它并完成最终的功能
	 * 
	 */
	private class MyExpandableListAdapter extends SimpleCursorTreeAdapter {

		public MyExpandableListAdapter(Cursor cursor, Context context,
				int groupLayout, int childLayout, String[] groupFrom,
				int[] groupTo, String[] childrenFrom, int[] childrenTo) {
			//别忘了调用父类的同等参数的构造函数
			//这里用了八个参数,lastChildLayout没有设置;还有就是groupLayout整合了collapsedGroupLayout和expandedGroupLayout
			super(context, cursor, groupLayout, groupFrom, groupTo,
					childLayout, childrenFrom, childrenTo);
		}

		/**
		 * 
		 * 回调函数,主要实现当选中某个组视图时,要查询指定的子视图所需的信息。
* 注意:
* 1.原例子中的电话号码的常量均以不推荐使用,所以采用最新的常量替换之。
* 2.别忘了在AdroidManifest.xml中配置权限。
* */ @Override protected Cursor getChildrenCursor(Cursor groupCursor) { //获取联系人ID Long contactId = groupCursor.getLong(mGroupIdColumnIndex); // 构造电话号码URI Uri.Builder builder = ContactsContract.CommonDataKinds.Phone.CONTENT_URI .buildUpon(); Uri phoneNumbersUri = builder.build(); //开始查询,Android推荐我们是其自身的managedQuery()方法进行查询,也就是自动管理Cursor。 return managedQuery( phoneNumbersUri, mPhoneNumberProjection, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? ", new String[] { String.valueOf(contactId) }, null); } } /** * 要查询联系人的电话号码的字段(也就是子视图的信息) */ private String mPhoneNumberProjection[] = new String[] { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.NUMBER, }; /** * 获取联系人ID的列位置,一般都是第一个,也就是0 */ private int mGroupIdColumnIndex; }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="cn.chris.scta" android:versionCode="1" android:versionName="1.0">
	<uses-sdk android:minSdkVersion="7" />

	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".AppMainAcitivity" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
	<!-- 授权读取联系人信息 -->
	<uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>