19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1983c6896cbf402623ef7d97f13ed65098df63429fTor Norbyeimport android.annotation.WorkerThread; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 21b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viveretteimport android.content.res.Resources; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.ContentObserver; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DataSetObserver; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 27b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viveretteimport android.view.ContextThemeWrapper; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 32647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * Adapter that exposes data from a {@link android.database.Cursor Cursor} to a 33647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * {@link android.widget.ListView ListView} widget. 34647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * <p> 35647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * The Cursor must include a column named "_id" or this class will not work. 36647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * Additionally, using {@link android.database.MergeCursor} with this class will 37647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * not work if the merged Cursors have overlapping values in their "_id" 38647e6bd99779d67798422ac8ae83e8085238d349Alan Viverette * columns. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class CursorAdapter extends BaseAdapter implements Filterable, 412add9bcf8c33c59f300551bdb0671bbff0b55794Alan Viverette CursorFilter.CursorFilterClient, ThemedSpinnerAdapter { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean mDataValid; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean mAutoRequery; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Cursor mCursor; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Context mContext; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 63b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * Context used for {@link #getDropDownView(int, View, ViewGroup)}. 64b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * {@hide} 65b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette */ 66b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette protected Context mDropDownContext; 67b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int mRowIDColumn; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected ChangeObserver mChangeObserver; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 81c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn protected DataSetObserver mDataSetObserver; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected CursorFilter mCursorFilter; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected FilterQueryProvider mFilterQueryProvider; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 94451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton * If set the adapter will call requery() on the cursor whenever a content change 95c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * notification is delivered. Implies {@link #FLAG_REGISTER_CONTENT_OBSERVER}. 96c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * 97c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @deprecated This option is discouraged, as it results in Cursor queries 98c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * being performed on the application's UI thread and thus can cause poor 99c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * responsiveness or even Application Not Responding errors. As an alternative, 100c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}. 101451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton */ 102c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn @Deprecated 103451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton public static final int FLAG_AUTO_REQUERY = 0x01; 104451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton 105451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton /** 106451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton * If set the adapter will register a content observer on the cursor and will call 107c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * {@link #onContentChanged()} when a notification comes in. Be careful when 108c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * using this flag: you will need to unset the current Cursor from the adapter 109c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * to avoid leaks due to its registered observers. This flag is not needed 110c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * when using a CursorAdapter with a 111c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * {@link android.content.CursorLoader}. 112451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton */ 113451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton public static final int FLAG_REGISTER_CONTENT_OBSERVER = 0x02; 114451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton 115451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton /** 116c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * Constructor that always enables auto-requery. 117c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * 118c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @deprecated This option is discouraged, as it results in Cursor queries 119c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * being performed on the application's UI thread and thus can cause poor 120c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * responsiveness or even Application Not Responding errors. As an alternative, 121c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c The cursor from which to get the data. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 126c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn @Deprecated 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CursorAdapter(Context context, Cursor c) { 128451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton init(context, c, FLAG_AUTO_REQUERY); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 132c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * Constructor that allows control over auto-requery. It is recommended 133c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * you not use this, but instead {@link #CursorAdapter(Context, Cursor, int)}. 134c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER} 135c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * will always be set. 136c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c The cursor from which to get the data. 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The context 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param autoRequery If true the adapter will call requery() on the 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cursor whenever it changes so the most recent 141c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * data is always displayed. Using true here is discouraged. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CursorAdapter(Context context, Cursor c, boolean autoRequery) { 14469e87f9b43b82b9a0f8a0fbc1c41251bbea212f9Jeff Hamilton init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER); 145451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton } 146451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton 147451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton /** 148c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * Recommended constructor. 149c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * 150451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton * @param c The cursor from which to get the data. 151451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton * @param context The context 152c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @param flags Flags used to determine the behavior of the adapter; may 153c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * be any combination of {@link #FLAG_AUTO_REQUERY} and 154c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * {@link #FLAG_REGISTER_CONTENT_OBSERVER}. 155451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton */ 156451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton public CursorAdapter(Context context, Cursor c, int flags) { 157451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton init(context, c, flags); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 160c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn /** 161c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @deprecated Don't use this, use the normal constructor. This will 162c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * be removed in the future. 163c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn */ 164c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn @Deprecated 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void init(Context context, Cursor c, boolean autoRequery) { 16669e87f9b43b82b9a0f8a0fbc1c41251bbea212f9Jeff Hamilton init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER); 167451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton } 168451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton 169c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn void init(Context context, Cursor c, int flags) { 170451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) { 171451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton flags |= FLAG_REGISTER_CONTENT_OBSERVER; 172451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton mAutoRequery = true; 173451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton } else { 174451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton mAutoRequery = false; 175451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean cursorPresent = c != null; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursor = c; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataValid = cursorPresent; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1; 181451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) { 182451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton mChangeObserver = new ChangeObserver(); 183c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn mDataSetObserver = new MyDataSetObserver(); 184451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton } else { 185451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton mChangeObserver = null; 186c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn mDataSetObserver = null; 187451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton } 188451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cursorPresent) { 190451513baa7b3fdd04b253b25e441a20a609de2edJeff Hamilton if (mChangeObserver != null) c.registerContentObserver(mChangeObserver); 191c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 196b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * Sets the {@link Resources.Theme} against which drop-down views are 197b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * inflated. 198b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * <p> 199b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * By default, drop-down views are inflated against the theme of the 200b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * {@link Context} passed to the adapter's constructor. 201b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * 202b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * @param theme the theme against which to inflate drop-down views or 203b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * {@code null} to use the theme from the adapter's context 204b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * @see #newDropDownView(Context, Cursor, ViewGroup) 205b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette */ 206b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette @Override 207b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette public void setDropDownViewTheme(Resources.Theme theme) { 208b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette if (theme == null) { 209b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mDropDownContext = null; 210b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } else if (theme == mContext.getTheme()) { 211b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mDropDownContext = mContext; 212b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } else { 213b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mDropDownContext = new ContextThemeWrapper(mContext, theme); 214b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 215b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 216b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette 217b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette @Override 218b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette public Resources.Theme getDropDownViewTheme() { 219b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette return mDropDownContext == null ? null : mDropDownContext.getTheme(); 220b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 221b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette 222b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette /** 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the cursor. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the cursor. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Cursor getCursor() { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter#getCount() 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2332c6b3b0c26b8efc40035fb70eec8562016c116a2Jeff Hamilton public int getCount() { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataValid && mCursor != null) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor.getCount(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter#getItem(int) 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2442c6b3b0c26b8efc40035fb70eec8562016c116a2Jeff Hamilton public Object getItem(int position) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataValid && mCursor != null) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursor.moveToPosition(position); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter#getItemId(int) 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2562c6b3b0c26b8efc40035fb70eec8562016c116a2Jeff Hamilton public long getItemId(int position) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataValid && mCursor != null) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCursor.moveToPosition(position)) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor.getLong(mRowIDColumn); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasStableIds() { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDataValid) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("this should only be called when the cursor is valid"); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mCursor.moveToPosition(position)) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("couldn't move cursor to position " + position); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View v; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = newView(mContext, mCursor, parent); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = convertView; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindView(v, mContext, mCursor); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getDropDownView(int position, View convertView, ViewGroup parent) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDataValid) { 296b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette final Context context = mDropDownContext == null ? mContext : mDropDownContext; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursor.moveToPosition(position); 298b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette final View v; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 300b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette v = newDropDownView(context, mCursor, parent); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = convertView; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 304b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette bindView(v, context, mCursor); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 310b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes a new view to hold the data pointed to by cursor. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Interface to application's global information 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cursor The cursor from which to get the data. The cursor is already 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * moved to the correct position. 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent The parent to which the new view is attached to 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the newly created view. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract View newView(Context context, Cursor cursor, ViewGroup parent); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Makes a new drop down view to hold the data pointed to by cursor. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Interface to application's global information 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cursor The cursor from which to get the data. The cursor is already 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * moved to the correct position. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent The parent to which the new view is attached to 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the newly created view. 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newView(context, cursor, parent); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bind an existing view to the data pointed to by cursor 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view Existing view, returned earlier by newView 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Interface to application's global information 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cursor The cursor from which to get the data. The cursor is already 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * moved to the correct position. 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void bindView(View view, Context context, Cursor cursor); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the underlying cursor to a new cursor. If there is an existing cursor it will be 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * closed. 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 346c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @param cursor The new cursor to be used 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void changeCursor(Cursor cursor) { 349c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn Cursor old = swapCursor(cursor); 350c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (old != null) { 351c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn old.close(); 352c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn } 353c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn } 354c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn 355c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn /** 356c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * Swap in a new Cursor, returning the old Cursor. Unlike 357c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em> 358c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * closed. 359c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * 360c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @param newCursor The new cursor to be used. 361c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * @return Returns the previously set Cursor, or null if there wasa not one. 362c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * If the given new Cursor is the same instance is the previously set 363c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn * Cursor, null is also returned. 364c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn */ 365c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn public Cursor swapCursor(Cursor newCursor) { 366c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (newCursor == mCursor) { 367c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn return null; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 369c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn Cursor oldCursor = mCursor; 370c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (oldCursor != null) { 371c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver); 372c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 374c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn mCursor = newCursor; 375c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (newCursor != null) { 376c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver); 377c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver); 378c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn mRowIDColumn = newCursor.getColumnIndexOrThrow("_id"); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataValid = true; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // notify the observers about the new cursor 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetChanged(); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRowIDColumn = -1; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataValid = false; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // notify the observers about the lack of a data set 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetInvalidated(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 388c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn return oldCursor; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Converts the cursor into a CharSequence. Subclasses should override this 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method to convert their results. The default implementation returns an 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * empty String for null values or the default String representation of 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the value.</p> 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cursor the cursor to convert to a CharSequence 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a CharSequence representing the value 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence convertToString(Cursor cursor) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cursor == null ? "" : cursor.toString(); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Runs a query with the specified constraint. This query is requested 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the filter attached to this adapter. 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The query is provided by a 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.FilterQueryProvider}. 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If no provider is specified, the current cursor is not filtered and returned. 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * After this method returns the resulting cursor is passed to {@link #changeCursor(Cursor)} 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the previous cursor is closed. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method is always executed on a background thread, not on the 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application's main thread (or UI thread.) 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contract: when constraint is null or empty, the original results, 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * prior to any filtering, must be returned. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param constraint the constraint with which the query must be filtered 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Cursor representing the results of the new query 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getFilter() 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getFilterQueryProvider() 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setFilterQueryProvider(android.widget.FilterQueryProvider) 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 42983c6896cbf402623ef7d97f13ed65098df63429fTor Norbye @WorkerThread 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilterQueryProvider != null) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilterQueryProvider.runQuery(constraint); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursor; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Filter getFilter() { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCursorFilter == null) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCursorFilter = new CursorFilter(this); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCursorFilter; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the query filter provider used for filtering. When the 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provider is null, no filtering occurs. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current filter query provider or null if it does not exist 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setFilterQueryProvider(android.widget.FilterQueryProvider) 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #runQueryOnBackgroundThread(CharSequence) 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FilterQueryProvider getFilterQueryProvider() { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilterQueryProvider; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the query filter provider used to filter the current Cursor. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The provider's 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.FilterQueryProvider#runQuery(CharSequence)} 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is invoked when filtering is requested by a client of 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this adapter. 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param filterQueryProvider the filter query provider or null to remove it 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getFilterQueryProvider() 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #runQueryOnBackgroundThread(CharSequence) 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilterQueryProvider = filterQueryProvider; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the {@link ContentObserver} on the cursor receives a change notification. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default implementation provides the auto-requery logic, but may be overridden by 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sub classes. 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see ContentObserver#onChange(boolean) 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onContentChanged() { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAutoRequery && mCursor != null && !mCursor.isClosed()) { 48343a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v("Cursor", "Auto requerying " + mCursor + " due to update"); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataValid = mCursor.requery(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ChangeObserver extends ContentObserver { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ChangeObserver() { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(new Handler()); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean deliverSelfNotifications() { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChange(boolean selfChange) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onContentChanged(); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyDataSetObserver extends DataSetObserver { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChanged() { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataValid = true; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetChanged(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onInvalidated() { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataValid = false; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetInvalidated(); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 519