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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
23e5b7632e5b3509beb7d0729a9640741d7f4ca466Romain Guy
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An easy adapter to map columns from a cursor to TextViews or ImageViews
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * defined in an XML file. You can specify which columns you want, which
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * views you want to display the columns, and the XML file that defines
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the appearance of these views.
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binding occurs in two phases. First, if a
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is invoked. If the returned value is true, binding has occured. If the
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned value is false and the view to bind is a TextView,
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setViewText(TextView, String)} is invoked. If the returned value
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is false and the view to bind is an ImageView,
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * binding can be found, an {@link IllegalStateException} is thrown.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this adapter is used with filtering, for instance in an
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.AutoCompleteTextView}, you can use the
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter} and the
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.FilterQueryProvider} interfaces
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to get control over the filtering process. You can refer to
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #convertToString(android.database.Cursor)} and
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #runQueryOnBackgroundThread(CharSequence)} for more information.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SimpleCursorAdapter extends ResourceCursorAdapter {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A list of columns containing the data to bind to the UI.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int[] mFrom;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A list of View ids representing the views to which the data must be bound.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int[] mTo;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mStringConversionColumn = -1;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CursorToStringConverter mCursorToStringConverter;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewBinder mViewBinder;
6530346c4399af45b46996f504004796177b975349Romain Guy
6630346c4399af45b46996f504004796177b975349Romain Guy    String[] mOriginalFrom;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
69c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * Constructor the enables auto-requery.
70c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     *
71c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * @deprecated This option is discouraged, as it results in Cursor queries
72c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * being performed on the application's UI thread and thus can cause poor
73c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * responsiveness or even Application Not Responding errors.  As an alternative,
74c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
75c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     */
76c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn    @Deprecated
77c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn    public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
78c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        super(context, layout, c);
79c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        mTo = to;
80c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        mOriginalFrom = from;
8187ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan        findColumns(c, from);
82c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn    }
83c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn
84c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn    /**
85c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * Standard constructor.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context where the ListView associated with this
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            SimpleListItemFactory is running
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layout resource identifier of a layout file that defines the views
90efdb6f978c12b768b4cfe9855c8d11dac59dd081Trevor Johns     *            for this list item. The layout file should include at least
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            those named views defined in "to"
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The database cursor.  Can be null if the cursor is not available yet.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param from A list of column names representing the data to bind to the UI.  Can be null
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            if the cursor is not available yet.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param to The views that should display column in the "from" parameter.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            These should all be TextViews. The first N views in this list
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            are given the values of the first N columns in the from
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            parameter.  Can be null if the cursor is not available yet.
99c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * @param flags Flags used to determine the behavior of the adapter,
100c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn     * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
102c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn    public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from,
103c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn            int[] to, int flags) {
104c91893511dc1b9e634648406c9ae61b15476e65dDianne Hackborn        super(context, layout, c, flags);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTo = to;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOriginalFrom = from;
10787ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan        findColumns(c, from);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Binds all of the field names passed into the "to" parameter of the
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constructor with their corresponding cursor columns as specified in the
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * "from" parameter.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Binding occurs in two phases. First, if a
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is invoked. If the returned value is true, binding has occured. If the
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned value is false and the view to bind is a TextView,
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setViewText(TextView, String)} is invoked. If the returned value is
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * false and the view to bind is an ImageView,
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * binding can be found, an {@link IllegalStateException} is thrown.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws IllegalStateException if binding cannot occur
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.CursorAdapter#bindView(android.view.View,
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *      android.content.Context, android.database.Cursor)
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getViewBinder()
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setViewImage(ImageView, String)
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setViewText(TextView, String)
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void bindView(View view, Context context, Cursor cursor) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewBinder binder = mViewBinder;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = mTo.length;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] from = mFrom;
139c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy        final int[] to = mTo;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
142c8ca2a3a07300349e2733e05255f01a677647f24Romain Guy            final View v = view.findViewById(to[i]);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean bound = false;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (binder != null) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bound = binder.setViewValue(v, cursor, from[i]);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!bound) {
1506ddfec1b193fb0ee9c55ae1f0648d6fcd66e7cd1Romain Guy                    String text = cursor.getString(from[i]);
1516ddfec1b193fb0ee9c55ae1f0648d6fcd66e7cd1Romain Guy                    if (text == null) {
1526ddfec1b193fb0ee9c55ae1f0648d6fcd66e7cd1Romain Guy                        text = "";
1536ddfec1b193fb0ee9c55ae1f0648d6fcd66e7cd1Romain Guy                    }
1546ddfec1b193fb0ee9c55ae1f0648d6fcd66e7cd1Romain Guy
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (v instanceof TextView) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        setViewText((TextView) v, text);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (v instanceof ImageView) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        setViewImage((ImageView) v, text);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw new IllegalStateException(v.getClass().getName() + " is not a " +
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " view that can be bounds by this SimpleCursorAdapter");
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the {@link ViewBinder} used to bind data to views.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a ViewBinder or null if the binder does not exist
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewBinder getViewBinder() {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewBinder;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the binder used to bind data to views.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param viewBinder the binder used to bind data to views, can be null to
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        remove the existing binder
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getViewBinder()
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setViewBinder(ViewBinder viewBinder) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewBinder = viewBinder;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by bindView() to set the image for an ImageView but only if
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * there is no existing ViewBinder or if the existing ViewBinder cannot
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handle binding to an ImageView.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * By default, the value will be treated as an image resource. If the
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value cannot be used as an image resource, the value is used as an
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * image Uri.
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intended to be overridden by Adapters that need to filter strings
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * retrieved from the database.
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param v ImageView to receive an image
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value the value retrieved from the cursor
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setViewImage(ImageView v, String value) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v.setImageResource(Integer.parseInt(value));
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (NumberFormatException nfe) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v.setImageURI(Uri.parse(value));
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by bindView() to set the text for a TextView but only if
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * there is no existing ViewBinder or if the existing ViewBinder cannot
219f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa     * handle binding to a TextView.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Intended to be overridden by Adapters that need to filter strings
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * retrieved from the database.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param v TextView to receive text
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text the text to be set for the TextView
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setViewText(TextView v, String text) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        v.setText(text);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the index of the column used to get a String representation
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the Cursor.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a valid index in the current Cursor or -1
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStringConversionColumn(int)
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCursorToStringConverter()
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStringConversionColumn() {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStringConversionColumn;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the index of the column in the Cursor used to get a String
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * representation of that Cursor. The column is used to convert the
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cursor to a String only when the current CursorToStringConverter
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is null.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param stringConversionColumn a valid index in the current Cursor or -1 to use the default
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        conversion mechanism
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStringConversionColumn()
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCursorToStringConverter()
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setStringConversionColumn(int stringConversionColumn) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStringConversionColumn = stringConversionColumn;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the converter used to convert the filtering Cursor
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into a String.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return null if the converter does not exist or an instance of
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link android.widget.SimpleCursorAdapter.CursorToStringConverter}
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStringConversionColumn()
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStringConversionColumn(int)
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CursorToStringConverter getCursorToStringConverter() {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCursorToStringConverter;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the converter  used to convert the filtering Cursor
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into a String.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cursorToStringConverter the Cursor to String converter, or
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        null to remove the converter
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getStringConversionColumn()
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setStringConversionColumn(int)
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCursorToStringConverter(CursorToStringConverter cursorToStringConverter) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCursorToStringConverter = cursorToStringConverter;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a CharSequence representation of the specified Cursor as defined
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the current CursorToStringConverter. If no CursorToStringConverter
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has been set, the String conversion column is used instead. If the
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * conversion column is -1, the returned String is empty if the cursor
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is null or Cursor.toString().
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cursor the Cursor to convert to a CharSequence
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a non-null CharSequence representing the cursor
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence convertToString(Cursor cursor) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCursorToStringConverter != null) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCursorToStringConverter.convertToString(cursor);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mStringConversionColumn > -1) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cursor.getString(mStringConversionColumn);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.convertToString(cursor);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31987ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan     * Create a map from an array of strings to an array of column-id integers in cursor c.
32087ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan     * If c is null, the array will be discarded.
32187ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan     *
32287ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan     * @param c the cursor to find the columns from
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param from the Strings naming the columns of interest
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32587ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan    private void findColumns(Cursor c, String[] from) {
32687ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan        if (c != null) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = from.length;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFrom == null || mFrom.length != count) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFrom = new int[count];
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i = 0; i < count; i++) {
33387ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan                mFrom[i] = c.getColumnIndexOrThrow(from[i]);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFrom = null;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3410e3b8f421dfcc5363f234eb1b76479cb2fb2e8eeDianne Hackborn    public Cursor swapCursor(Cursor c) {
34251d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        // super.swapCursor() will notify observers before we have
34351d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        // a valid mapping, make sure we have a mapping before this
34451d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        // happens
34587ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan        findColumns(c, mOriginalFrom);
34687ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan        return super.swapCursor(c);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the cursor and change the column-to-view mappings at the same time.
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param c The database cursor.  Can be null if the cursor is not available yet.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param from A list of column names representing the data to bind to the UI.  Can be null
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            if the cursor is not available yet.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param to The views that should display column in the "from" parameter.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            These should all be TextViews. The first N views in this list
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            are given the values of the first N columns in the from
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            parameter.  Can be null if the cursor is not available yet.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void changeCursorAndColumns(Cursor c, String[] from, int[] to) {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOriginalFrom = from;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTo = to;
36351d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        // super.changeCursor() will notify observers before we have
36451d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        // a valid mapping, make sure we have a mapping before this
36551d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        // happens
36687ab6962e44914fdee767c5be6b316228d2b7889Hung-ying Tyan        findColumns(c, mOriginalFrom);
36751d6eb7dcfb776cb70a337ba4fd1eaadc94d8688Romain Guy        super.changeCursor(c);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This class can be used by external clients of SimpleCursorAdapter
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to bind values fom the Cursor to views.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You should use this class to bind values from the Cursor to views
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that are not directly supported by SimpleCursorAdapter or to
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change the way binding occurs for views supported by
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SimpleCursorAdapter.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see SimpleCursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see SimpleCursorAdapter#setViewImage(ImageView, String)
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see SimpleCursorAdapter#setViewText(TextView, String)
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface ViewBinder {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Binds the Cursor column defined by the specified index to the specified view.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * When binding is handled by this ViewBinder, this method must return true.
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If this method returns false, SimpleCursorAdapter will attempts to handle
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the binding on its own.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param view the view to bind the data to
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cursor the cursor to get the data from
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param columnIndex the column at which the data can be found in the cursor
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return true if the data was bound to the view, false otherwise
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean setViewValue(View view, Cursor cursor, int columnIndex);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This class can be used by external clients of SimpleCursorAdapter
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to define how the Cursor should be converted to a String.
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface CursorToStringConverter {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a CharSequence representing the specified Cursor.
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param cursor the cursor for which a CharSequence representation
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        is requested
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a non-null CharSequence representing the cursor
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence convertToString(Cursor cursor);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
419