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.util.Log; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 278c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauerimport java.util.Collection; 28c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.util.Collections; 29be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunneimport java.util.Comparator; 30be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunneimport java.util.List; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 33b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * A concrete BaseAdapter that is backed by an array of arbitrary 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects. By default this class expects that the provided resource id references 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single TextView. If you want to use a more complex layout, use the constructors that 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also takes a field id. That field id should reference a TextView in the larger layout 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 39b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>However the TextView is referenced, it will be filled with the toString() of each object in 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the array. You can add lists or arrays of custom objects. Override the toString() method 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of your objects to determine what text will be displayed for the item in the list. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 43b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>To use something other than TextViews for the array display, for instance, ImageViews, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or to have some of data besides toString() results fill the views, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override {@link #getView(int, View, ViewGroup)} to return the type of view you want. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ArrayAdapter<T> extends BaseAdapter implements Filterable { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains the list of objects that represent the data of this ArrayAdapter. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content of this list is referred to as "the array" in the documentation. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<T> mObjects; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lock used to modify the content of {@link #mObjects}. Any write operation 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * performed on the array should be synchronized on this lock. This lock is also 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used by the filter (see {@link #getFilter()} to make a synchronized copy of 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the original array of data. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mLock = new Object(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource indicating what views to inflate to display the content of this 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array adapter. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mResource; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource indicating what views to inflate to display the content of this 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array adapter in a drop down widget. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownResource; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the inflated resource is not a TextView, {@link #mFieldId} is used to find 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a TextView inside the inflated views hierarchy. This field must contain the 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier that matches the one defined in the resource file. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mFieldId = 0; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether or not {@link #notifyDataSetChanged()} must be called whenever 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #mObjects} is modified. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNotifyOnChange = true; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 878c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer private Context mContext; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // A copy of the original mObjects array, initialized from and then used instead as soon as 90be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // the mFilter ArrayFilter is used. mObjects will then only contain the filtered values. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<T> mOriginalValues; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayFilter mFilter; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutInflater mInflater; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1009c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy * @param resource The resource ID for a layout file containing a TextView to use when 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy public ArrayAdapter(Context context, int resource) { 1049c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy init(context, resource, 0, new ArrayList<T>()); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int resource, int textViewResourceId) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, resource, textViewResourceId, new ArrayList<T>()); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1239c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy * @param resource The resource ID for a layout file containing a TextView to use when 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy public ArrayAdapter(Context context, int resource, T[] objects) { 1289c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy init(context, resource, 0, Arrays.asList(objects)); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, resource, textViewResourceId, Arrays.asList(objects)); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1489c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy * @param resource The resource ID for a layout file containing a TextView to use when 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1529c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy public ArrayAdapter(Context context, int resource, List<T> objects) { 1539c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy init(context, resource, 0, objects); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, resource, textViewResourceId, objects); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds the specified object at the end of the array. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to add at the end of the array. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void add(T object) { 175be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 176be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.add(object); 178be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 179be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.add(object); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 182be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1868c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * Adds the specified Collection at the end of the array. 1878c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * 1888c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * @param collection The Collection to add at the end of the array. 1898c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer */ 1908c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer public void addAll(Collection<? extends T> collection) { 191be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 192be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 1938c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer mOriginalValues.addAll(collection); 194be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 195be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.addAll(collection); 1968c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 1978c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 198be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 1998c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2008c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer 2018c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer /** 2028c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * Adds the specified items at the end of the array. 2038c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * 2048c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * @param items The items to add at the end of the array. 2058c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer */ 2068c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer public void addAll(T ... items) { 207be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 208be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 20995a78c38373bb99258d83a6ab2c92825d979f200Romain Guy Collections.addAll(mOriginalValues, items); 210be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 21195a78c38373bb99258d83a6ab2c92825d979f200Romain Guy Collections.addAll(mObjects, items); 2128c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2138c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 214be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 2158c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2168c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer 2178c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer /** 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inserts the specified object at the specified index in the array. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to insert into the array. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index at which the object must be inserted. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void insert(T object, int index) { 224be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 225be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.add(index, object); 227be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 228be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.add(index, object); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 231be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes the specified object from the array. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to remove. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void remove(T object) { 240be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 241be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.remove(object); 243be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 244be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.remove(object); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all elements from the list. 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear() { 254be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 255be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.clear(); 257be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 258be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.clear(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 265c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sorts the content of this adapter using the specified comparator. 266c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 267c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param comparator The comparator used to sort the objects contained 268c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * in this adapter. 269c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 270c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void sort(Comparator<? super T> comparator) { 271be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 272be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 273be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne Collections.sort(mOriginalValues, comparator); 274be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 275be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne Collections.sort(mObjects, comparator); 276be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } 277be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } 2788c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer if (mNotifyOnChange) notifyDataSetChanged(); 279c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 280c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 281c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataSetChanged() { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.notifyDataSetChanged(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotifyOnChange = true; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Control whether methods that change the list ({@link #add}, 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #insert}, {@link #remove}, {@link #clear}) automatically call 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #notifyDataSetChanged}. If set to false, caller must 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manually call notifyDataSetChanged() to have the changes 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reflected in the attached view. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default is true, and calling notifyDataSetChanged() 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resets the flag to true. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param notifyOnChange if true, modifications to the list will 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically call {@link 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #notifyDataSetChanged} 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotifyOnChange(boolean notifyOnChange) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotifyOnChange = notifyOnChange; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void init(Context context, int resource, int textViewResourceId, List<T> objects) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResource = mDropDownResource = resource; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects = objects; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFieldId = textViewResourceId; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the context associated with this array adapter. The context is used 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to create views from the resource passed to the constructor. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The Context associated with this adapter. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getContext() { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.size(); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public T getItem(int position) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.get(position); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the position of the specified item in the array. 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param item The item to retrieve the position of. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The position of the specified item. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPosition(T item) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.indexOf(item); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createViewFromResource(position, convertView, parent, mResource); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View createViewFromResource(int position, View convertView, ViewGroup parent, 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resource) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mInflater.inflate(resource, parent, false); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = convertView; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFieldId == 0) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If no custom field is assigned, assume the whole resource is a TextView 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = (TextView) view; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Otherwise, find the TextView field within the layout 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = (TextView) view.findViewById(mFieldId); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassCastException e) { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException( 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ArrayAdapter requires the resource ID to be a TextView", e); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 390b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa T item = getItem(position); 391b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa if (item instanceof CharSequence) { 392b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa text.setText((CharSequence)item); 393b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa } else { 394b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa text.setText(item.toString()); 395b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the layout resource to create the drop down views.</p> 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource the layout resource defining the drop down views 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDropDownView(int, android.view.View, android.view.ViewGroup) 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownViewResource(int resource) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mDropDownResource = resource; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getDropDownView(int position, View convertView, ViewGroup parent) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createViewFromResource(position, convertView, parent, mDropDownResource); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new ArrayAdapter from external resources. The content of the array is 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtained through {@link android.content.res.Resources#getTextArray(int)}. 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application's environment. 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textArrayResId The identifier of the array to use as the data source. 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResId The identifier of the layout used to create views. 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An ArrayAdapter<CharSequence>. 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ArrayAdapter<CharSequence> createFromResource(Context context, 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int textArrayResId, int textViewResId) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence[] strings = context.getResources().getTextArray(textArrayResId); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ArrayAdapter<CharSequence>(context, textViewResId, strings); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Filter getFilter() { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter == null) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = new ArrayFilter(); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An array filter constrains the content of the array adapter with 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a prefix. Each item that does not start with the supplied prefix 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is removed from the list.</p> 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ArrayFilter extends Filter { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected FilterResults performFiltering(CharSequence prefix) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FilterResults results = new FilterResults(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues == null) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues = new ArrayList<T>(mObjects); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (prefix == null || prefix.length() == 0) { 46195a78c38373bb99258d83a6ab2c92825d979f200Romain Guy ArrayList<T> list; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 46395a78c38373bb99258d83a6ab2c92825d979f200Romain Guy list = new ArrayList<T>(mOriginalValues); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46595a78c38373bb99258d83a6ab2c92825d979f200Romain Guy results.values = list; 46695a78c38373bb99258d83a6ab2c92825d979f200Romain Guy results.count = list.size(); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefixString = prefix.toString().toLowerCase(); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47095a78c38373bb99258d83a6ab2c92825d979f200Romain Guy ArrayList<T> values; 47195a78c38373bb99258d83a6ab2c92825d979f200Romain Guy synchronized (mLock) { 47295a78c38373bb99258d83a6ab2c92825d979f200Romain Guy values = new ArrayList<T>(mOriginalValues); 47395a78c38373bb99258d83a6ab2c92825d979f200Romain Guy } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47595a78c38373bb99258d83a6ab2c92825d979f200Romain Guy final int count = values.size(); 47695a78c38373bb99258d83a6ab2c92825d979f200Romain Guy final ArrayList<T> newValues = new ArrayList<T>(); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final T value = values.get(i); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String valueText = value.toString().toLowerCase(); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First match against the whole, non-splitted value 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueText.startsWith(prefixString)) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newValues.add(value); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] words = valueText.split(" "); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int wordCount = words.length; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // Start at index 0, in case valueText starts with space(s) 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < wordCount; k++) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (words[k].startsWith(prefixString)) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newValues.add(value); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.values = newValues; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.count = newValues.size(); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return results; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void publishResults(CharSequence constraint, FilterResults results) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects = (List<T>) results.values; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.count > 0) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetChanged(); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetInvalidated(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 518