| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.apis.view; |
| |
| import android.app.ExpandableListActivity; |
| import android.content.AsyncQueryHandler; |
| import android.content.ContentUris; |
| import android.content.Context; |
| import android.database.Cursor; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.provider.ContactsContract.CommonDataKinds.Phone; |
| import android.provider.ContactsContract.Contacts; |
| import android.widget.CursorTreeAdapter; |
| import android.widget.SimpleCursorTreeAdapter; |
| |
| /** |
| * Demonstrates expandable lists backed by Cursors |
| */ |
| public class ExpandableList2 extends ExpandableListActivity { |
| |
| private static final String[] CONTACTS_PROJECTION = new String[] { |
| Contacts._ID, |
| Contacts.DISPLAY_NAME |
| }; |
| private static final int GROUP_ID_COLUMN_INDEX = 0; |
| |
| private static final String[] PHONE_NUMBER_PROJECTION = new String[] { |
| Phone._ID, |
| Phone.NUMBER |
| }; |
| |
| private static final int TOKEN_GROUP = 0; |
| private static final int TOKEN_CHILD = 1; |
| |
| private static final class QueryHandler extends AsyncQueryHandler { |
| private CursorTreeAdapter mAdapter; |
| |
| public QueryHandler(Context context, CursorTreeAdapter adapter) { |
| super(context.getContentResolver()); |
| this.mAdapter = adapter; |
| } |
| |
| @Override |
| protected void onQueryComplete(int token, Object cookie, Cursor cursor) { |
| switch (token) { |
| case TOKEN_GROUP: |
| mAdapter.setGroupCursor(cursor); |
| break; |
| |
| case TOKEN_CHILD: |
| int groupPosition = (Integer) cookie; |
| mAdapter.setChildrenCursor(groupPosition, cursor); |
| break; |
| } |
| } |
| } |
| |
| public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { |
| |
| // Note that the constructor does not take a Cursor. This is done to avoid querying the |
| // database on the main thread. |
| public MyExpandableListAdapter(Context context, int groupLayout, |
| int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom, |
| int[] childrenTo) { |
| |
| super(context, null, groupLayout, groupFrom, groupTo, childLayout, childrenFrom, |
| childrenTo); |
| } |
| |
| @Override |
| protected Cursor getChildrenCursor(Cursor groupCursor) { |
| // Given the group, we return a cursor for all the children within that group |
| |
| // Return a cursor that points to this contact's phone numbers |
| Uri.Builder builder = Contacts.CONTENT_URI.buildUpon(); |
| ContentUris.appendId(builder, groupCursor.getLong(GROUP_ID_COLUMN_INDEX)); |
| builder.appendEncodedPath(Contacts.Data.CONTENT_DIRECTORY); |
| Uri phoneNumbersUri = builder.build(); |
| |
| mQueryHandler.startQuery(TOKEN_CHILD, groupCursor.getPosition(), phoneNumbersUri, |
| PHONE_NUMBER_PROJECTION, Phone.MIMETYPE + "=?", |
| new String[] { Phone.CONTENT_ITEM_TYPE }, null); |
| |
| return null; |
| } |
| } |
| |
| private QueryHandler mQueryHandler; |
| private CursorTreeAdapter mAdapter; |
| |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| // Set up our adapter |
| mAdapter = new MyExpandableListAdapter( |
| this, |
| android.R.layout.simple_expandable_list_item_1, |
| android.R.layout.simple_expandable_list_item_1, |
| new String[] { Contacts.DISPLAY_NAME }, // Name for group layouts |
| new int[] { android.R.id.text1 }, |
| new String[] { Phone.NUMBER }, // Number for child layouts |
| new int[] { android.R.id.text1 }); |
| |
| setListAdapter(mAdapter); |
| |
| mQueryHandler = new QueryHandler(this, mAdapter); |
| |
| // Query for people |
| mQueryHandler.startQuery(TOKEN_GROUP, null, Contacts.CONTENT_URI, CONTACTS_PROJECTION, |
| Contacts.HAS_PHONE_NUMBER + "=1", null, null); |
| } |
| |
| @Override |
| protected void onDestroy() { |
| super.onDestroy(); |
| |
| // Null out the group cursor. This will cause the group cursor and all of the child cursors |
| // to be closed. |
| mAdapter.changeCursor(null); |
| mAdapter = null; |
| } |
| } |