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;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
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 views
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you want to display the columns, and the XML file that defines the appearance
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of these views. Separate XML files for child and groups are possible.
2966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler *
3066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * Binding occurs in two phases. First, if a
3166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * {@link android.widget.SimpleCursorTreeAdapter.ViewBinder} is available,
3266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}
3366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * is invoked. If the returned value is true, binding has occurred. If the
3466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * returned value is false and the view to bind is a TextView,
3566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * {@link #setViewText(TextView, String)} is invoked. If the returned value
3666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * is false and the view to bind is an ImageView,
3766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate
3866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler * binding can be found, an {@link IllegalStateException} is thrown.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class SimpleCursorTreeAdapter extends ResourceCursorTreeAdapter {
414b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
424b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks    /** The name of the columns that contain the data to display for a group. */
434b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks    private String[] mGroupFromNames;
444b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The indices of columns that contain data to display for a group. */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mGroupFrom;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The View IDs that will display a group's data fetched from the
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * corresponding column.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mGroupTo;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
534b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks    /** The name of the columns that contain the data to display for a child. */
544b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks    private String[] mChildFromNames;
554b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** The indices of columns that contain data to display for a child. */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mChildFrom;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The View IDs that will display a child's data fetched from the
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * corresponding column.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mChildTo;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * View binder, if supplied
6666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     */
6766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    private ViewBinder mViewBinder;
6866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
6966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context where the {@link ExpandableListView}
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            associated with this {@link SimpleCursorTreeAdapter} is
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            running
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cursor The database cursor
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param collapsedGroupLayout The resource identifier of a layout file that
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            defines the views for a collapsed group. The layout file
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should include at least those named views defined in groupTo.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param expandedGroupLayout The resource identifier of a layout file that
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            defines the views for an expanded group. The layout file
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should include at least those named views defined in groupTo.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupFrom A list of column names that will be used to display the
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            data for a group.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupTo The group views (from the group layouts) that should
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display column in the "from" parameter. These should all be
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            TextViews or ImageViews. The first N views in this list are
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            given the values of the first N columns in the from parameter.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childLayout The resource identifier of a layout file that defines
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the views for a child (except the last). The layout file
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should include at least those named views defined in childTo.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param lastChildLayout The resource identifier of a layout file that
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            defines the views for the last child within a group. The
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            layout file should include at least those named views defined
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            in childTo.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childFrom A list of column names that will be used to display the
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            data for a child.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childTo The child views (from the child layouts) that should
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display column in the "from" parameter. These should all be
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            TextViews or ImageViews. The first N views in this list are
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            given the values of the first N columns in the from parameter.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SimpleCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int expandedGroupLayout, String[] groupFrom, int[] groupTo, int childLayout,
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int lastChildLayout, String[] childFrom, int[] childTo) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, cursor, collapsedGroupLayout, expandedGroupLayout, childLayout,
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastChildLayout);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(groupFrom, groupTo, childFrom, childTo);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context where the {@link ExpandableListView}
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            associated with this {@link SimpleCursorTreeAdapter} is
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            running
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cursor The database cursor
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param collapsedGroupLayout The resource identifier of a layout file that
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            defines the views for a collapsed group. The layout file
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should include at least those named views defined in groupTo.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param expandedGroupLayout The resource identifier of a layout file that
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            defines the views for an expanded group. The layout file
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should include at least those named views defined in groupTo.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupFrom A list of column names that will be used to display the
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            data for a group.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupTo The group views (from the group layouts) that should
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display column in the "from" parameter. These should all be
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            TextViews or ImageViews. The first N views in this list are
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            given the values of the first N columns in the from parameter.
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childLayout The resource identifier of a layout file that defines
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the views for a child. The layout file
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            should include at least those named views defined in childTo.
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childFrom A list of column names that will be used to display the
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            data for a child.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childTo The child views (from the child layouts) that should
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display column in the "from" parameter. These should all be
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            TextViews or ImageViews. The first N views in this list are
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            given the values of the first N columns in the from parameter.
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SimpleCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int expandedGroupLayout, String[] groupFrom, int[] groupTo,
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int childLayout, String[] childFrom, int[] childTo) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, cursor, collapsedGroupLayout, expandedGroupLayout, childLayout);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(groupFrom, groupTo, childFrom, childTo);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor.
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The context where the {@link ExpandableListView}
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            associated with this {@link SimpleCursorTreeAdapter} is
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            running
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cursor The database cursor
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupLayout The resource identifier of a layout file that defines
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the views for a group. The layout file should include at least
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            those named views defined in groupTo.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupFrom A list of column names that will be used to display the
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            data for a group.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param groupTo The group views (from the group layouts) that should
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display column in the "from" parameter. These should all be
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            TextViews or ImageViews. The first N views in this list are
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            given the values of the first N columns in the from parameter.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childLayout The resource identifier of a layout file that defines
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the views for a child. The layout file should include at least
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            those named views defined in childTo.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childFrom A list of column names that will be used to display the
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            data for a child.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childTo The child views (from the child layouts) that should
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            display column in the "from" parameter. These should all be
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            TextViews or ImageViews. The first N views in this list are
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            given the values of the first N columns in the from parameter.
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SimpleCursorTreeAdapter(Context context, Cursor cursor, int groupLayout,
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom,
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int[] childTo) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, cursor, groupLayout, childLayout);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init(groupFrom, groupTo, childFrom, childTo);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void init(String[] groupFromNames, int[] groupTo, String[] childFromNames,
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int[] childTo) {
1814b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
1824b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        mGroupFromNames = groupFromNames;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGroupTo = groupTo;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1854b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        mChildFromNames = childFromNames;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mChildTo = childTo;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    /**
19066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * Returns the {@link ViewBinder} used to bind data to views.
19166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
19266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @return a ViewBinder or null if the binder does not exist
19366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
19466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @see #setViewBinder(android.widget.SimpleCursorTreeAdapter.ViewBinder)
19566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     */
19666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    public ViewBinder getViewBinder() {
19766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler        return mViewBinder;
19866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    }
19966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
20066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    /**
20166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * Sets the binder used to bind data to views.
20266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
20366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @param viewBinder the binder used to bind data to views, can be null to
20466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *        remove the existing binder
20566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
20666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @see #getViewBinder()
20766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     */
20866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    public void setViewBinder(ViewBinder viewBinder) {
20966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler        mViewBinder = viewBinder;
21066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    }
21166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void bindView(View view, Context context, Cursor cursor, int[] from, int[] to) {
21366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler        final ViewBinder binder = mViewBinder;
21466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < to.length; i++) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View v = view.findViewById(to[i]);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
21866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                boolean bound = false;
21966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                if (binder != null) {
22066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    bound = binder.setViewValue(v, cursor, from[i]);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
22366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                if (!bound) {
22466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    String text = cursor.getString(from[i]);
22566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    if (text == null) {
22666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                        text = "";
22766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    }
22866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    if (v instanceof TextView) {
22966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                        setViewText((TextView) v, text);
23066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    } else if (v instanceof ImageView) {
23166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                        setViewImage((ImageView) v, text);
23266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    } else {
23366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                        throw new IllegalStateException("SimpleCursorTreeAdapter can bind values" +
23466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                                " only to TextView and ImageView!");
23566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler                    }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2414b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks    private void initFromColumns(Cursor cursor, String[] fromColumnNames, int[] fromColumns) {
2424b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        for (int i = fromColumnNames.length - 1; i >= 0; i--) {
2434b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks            fromColumns[i] = cursor.getColumnIndexOrThrow(fromColumnNames[i]);
2444b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        }
2454b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks    }
2464b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {
2494b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        if (mChildFrom == null) {
2504b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks            mChildFrom = new int[mChildFromNames.length];
2514b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks            initFromColumns(cursor, mChildFromNames, mChildFrom);
2524b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        }
2534b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bindView(view, context, cursor, mChildFrom, mChildTo);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {
2594b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        if (mGroupFrom == null) {
2604b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks            mGroupFrom = new int[mGroupFromNames.length];
2614b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks            initFromColumns(cursor, mGroupFromNames, mGroupFrom);
2624b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks        }
2634b08d3e4372d994ac5c5a97d8da528e5d682e732Jason Parks
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bindView(view, context, cursor, mGroupFrom, mGroupTo);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by bindView() to set the image for an ImageView. By default, the
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value will be treated as a Uri. Intended to be overridden by Adapters
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that need to filter strings retrieved from the database.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param v ImageView to receive an image
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param value the value retrieved from the cursor
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void setViewImage(ImageView v, String value) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v.setImageResource(Integer.parseInt(value));
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (NumberFormatException nfe) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v.setImageURI(Uri.parse(value));
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
28366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    /**
28466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * Called by bindView() to set the text for a TextView but only if
28566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * there is no existing ViewBinder or if the existing ViewBinder cannot
286f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa     * handle binding to a TextView.
28766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
28866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * Intended to be overridden by Adapters that need to filter strings
28966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * retrieved from the database.
29066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
29166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @param v TextView to receive text
29266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @param text the text to be set for the TextView
29366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     */
29466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    public void setViewText(TextView v, String text) {
29566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler        v.setText(text);
29666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    }
29766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler
29866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    /**
29966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * This class can be used by external clients of SimpleCursorTreeAdapter
30066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * to bind values from the Cursor to views.
30166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
30266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * You should use this class to bind values from the Cursor to views
30366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * that are not directly supported by SimpleCursorTreeAdapter or to
30466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * change the way binding occurs for views supported by
30566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * SimpleCursorTreeAdapter.
30666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     *
30766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @see SimpleCursorTreeAdapter#setViewImage(ImageView, String)
30866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     * @see SimpleCursorTreeAdapter#setViewText(TextView, String)
30966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler     */
31066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    public static interface ViewBinder {
31166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler        /**
31266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * Binds the Cursor column defined by the specified index to the specified view.
31366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         *
31466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * When binding is handled by this ViewBinder, this method must return true.
31566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * If this method returns false, SimpleCursorTreeAdapter will attempts to handle
31666e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * the binding on its own.
31766e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         *
31866e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * @param view the view to bind the data to
31966e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * @param cursor the cursor to get the data from
32066e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * @param columnIndex the column at which the data can be found in the cursor
32166e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         *
32266e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         * @return true if the data was bound to the view, false otherwise
32366e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler         */
32466e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler        boolean setViewValue(View view, Cursor cursor, int columnIndex);
32566e4aed2ace3fa57c631de6961d7d6200de0f451Andrew Stadler    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
327