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 197b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.ArrayRes; 207b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.IdRes; 217b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.LayoutRes; 22417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbyeimport android.annotation.NonNull; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 24b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viveretteimport android.content.res.Resources; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 26b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viveretteimport android.view.ContextThemeWrapper; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 338c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauerimport java.util.Collection; 34c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.util.Collections; 35be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunneimport java.util.Comparator; 36be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunneimport java.util.List; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 39b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * A concrete BaseAdapter that is backed by an array of arbitrary 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects. By default this class expects that the provided resource id references 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single TextView. If you want to use a more complex layout, use the constructors that 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also takes a field id. That field id should reference a TextView in the larger layout 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 45b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>However the TextView is referenced, it will be filled with the toString() of each object in 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the array. You can add lists or arrays of custom objects. Override the toString() method 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of your objects to determine what text will be displayed for the item in the list. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>To use something other than TextViews for the array display, for instance, ImageViews, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or to have some of data besides toString() results fill the views, 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override {@link #getView(int, View, ViewGroup)} to return the type of view you want. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 532add9bcf8c33c59f300551bdb0671bbff0b55794Alan Viverettepublic class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter { 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 627d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette private final LayoutInflater mInflater; 637d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette 647d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette /** 657d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette * Contains the list of objects that represent the data of this ArrayAdapter. 667d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette * The content of this list is referred to as "the array" in the documentation. 677d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette */ 687d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette private List<T> mObjects; 697d5967e55edc8c3dfdf72aea263b5543a2b6e801Alan Viverette 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource indicating what views to inflate to display the content of this 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array adapter. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mResource; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource indicating what views to inflate to display the content of this 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array adapter in a drop down widget. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownResource; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the inflated resource is not a TextView, {@link #mFieldId} is used to find 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a TextView inside the inflated views hierarchy. This field must contain the 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier that matches the one defined in the resource file. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mFieldId = 0; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether or not {@link #notifyDataSetChanged()} must be called whenever 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #mObjects} is modified. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNotifyOnChange = true; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 958c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer private Context mContext; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 97be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // A copy of the original mObjects array, initialized from and then used instead as soon as 98be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // the mFilter ArrayFilter is used. mObjects will then only contain the filtered values. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<T> mOriginalValues; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayFilter mFilter; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 102b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette /** Layout inflater used for {@link #getDropDownView(int, View, ViewGroup)}. */ 103b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette private LayoutInflater mDropDownInflater; 104b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1099c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy * @param resource The resource ID for a layout file containing a TextView to use when 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1127b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public ArrayAdapter(Context context, @LayoutRes int resource) { 113b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette this(context, resource, 0, new ArrayList<T>()); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1247b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId) { 125b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette this(context, resource, textViewResourceId, new ArrayList<T>()); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1329c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy * @param resource The resource ID for a layout file containing a TextView to use when 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 136417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public ArrayAdapter(Context context, @LayoutRes int resource, @NonNull T[] objects) { 137b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette this(context, resource, 0, Arrays.asList(objects)); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 149417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId, 150417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye @NonNull T[] objects) { 151b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette this(context, resource, textViewResourceId, Arrays.asList(objects)); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1589c5d1b17bfae81c282cec8954e66963c86c81438Romain Guy * @param resource The resource ID for a layout file containing a TextView to use when 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 162417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public ArrayAdapter(Context context, @LayoutRes int resource, @NonNull List<T> objects) { 163b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette this(context, resource, 0, objects); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 175417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId, 176417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye @NonNull List<T> objects) { 177b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mContext = context; 178b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mInflater = LayoutInflater.from(context); 179b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mResource = mDropDownResource = resource; 180b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mObjects = objects; 181b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mFieldId = textViewResourceId; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds the specified object at the end of the array. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to add at the end of the array. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void add(T object) { 190be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 191be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.add(object); 193be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 194be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.add(object); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 197be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2018c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * Adds the specified Collection at the end of the array. 2028c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * 2038c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * @param collection The Collection to add at the end of the array. 2048c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer */ 2058c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer public void addAll(Collection<? extends T> collection) { 206be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 207be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2088c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer mOriginalValues.addAll(collection); 209be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 210be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.addAll(collection); 2118c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2128c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 213be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 2148c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2158c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer 2168c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer /** 2178c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * Adds the specified items at the end of the array. 2188c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * 2198c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer * @param items The items to add at the end of the array. 2208c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer */ 2218c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer public void addAll(T ... items) { 222be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 223be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 22495a78c38373bb99258d83a6ab2c92825d979f200Romain Guy Collections.addAll(mOriginalValues, items); 225be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 22695a78c38373bb99258d83a6ab2c92825d979f200Romain Guy Collections.addAll(mObjects, items); 2278c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2288c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 229be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 2308c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer } 2318c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer 2328c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer /** 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inserts the specified object at the specified index in the array. 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to insert into the array. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index at which the object must be inserted. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void insert(T object, int index) { 239be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 240be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.add(index, object); 242be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 243be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.add(index, object); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 246be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mNotifyOnChange) notifyDataSetChanged(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes the specified object from the array. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to remove. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void remove(T object) { 255be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 256be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.remove(object); 258be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 259be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.remove(object); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all elements from the list. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear() { 269be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 270be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.clear(); 272be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 273be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mObjects.clear(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 280c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sorts the content of this adapter using the specified comparator. 281c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 282c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param comparator The comparator used to sort the objects contained 283c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * in this adapter. 284c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 285c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void sort(Comparator<? super T> comparator) { 286be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne synchronized (mLock) { 287be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (mOriginalValues != null) { 288be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne Collections.sort(mOriginalValues, comparator); 289be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } else { 290be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne Collections.sort(mObjects, comparator); 291be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } 292be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } 2938c582ef859fcbbb97623d22024c3ecb32b65c5efChristian Mehlmauer if (mNotifyOnChange) notifyDataSetChanged(); 294c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 295c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 296c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataSetChanged() { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.notifyDataSetChanged(); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotifyOnChange = true; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Control whether methods that change the list ({@link #add}, 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #insert}, {@link #remove}, {@link #clear}) automatically call 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #notifyDataSetChanged}. If set to false, caller must 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manually call notifyDataSetChanged() to have the changes 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reflected in the attached view. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default is true, and calling notifyDataSetChanged() 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resets the flag to true. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param notifyOnChange if true, modifications to the list will 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically call {@link 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #notifyDataSetChanged} 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotifyOnChange(boolean notifyOnChange) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotifyOnChange = notifyOnChange; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the context associated with this array adapter. The context is used 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to create views from the resource passed to the constructor. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The Context associated with this adapter. 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getContext() { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 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 int getCount() { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.size(); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public T getItem(int position) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.get(position); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the position of the specified item in the array. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param item The item to retrieve the position of. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The position of the specified item. 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPosition(T item) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.indexOf(item); 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 long getItemId(int position) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 369b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette return createViewFromResource(mInflater, position, convertView, parent, mResource); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 372b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette private View createViewFromResource(LayoutInflater inflater, int position, View convertView, 373b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette ViewGroup parent, int resource) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 378b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette view = inflater.inflate(resource, parent, false); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = convertView; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFieldId == 0) { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If no custom field is assigned, assume the whole resource is a TextView 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = (TextView) view; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Otherwise, find the TextView field within the layout 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = (TextView) view.findViewById(mFieldId); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassCastException e) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException( 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ArrayAdapter requires the resource ID to be a TextView", e); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 397b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa T item = getItem(position); 398b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa if (item instanceof CharSequence) { 399b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa text.setText((CharSequence)item); 400b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa } else { 401b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa text.setText(item.toString()); 402b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the layout resource to create the drop down views.</p> 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource the layout resource defining the drop down views 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDropDownView(int, android.view.View, android.view.ViewGroup) 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4137b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public void setDropDownViewResource(@LayoutRes int resource) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mDropDownResource = resource; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 418b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * Sets the {@link Resources.Theme} against which drop-down views are 419b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * inflated. 420b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * <p> 421b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * By default, drop-down views are inflated against the theme of the 422b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * {@link Context} passed to the adapter's constructor. 423b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * 424b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * @param theme the theme against which to inflate drop-down views or 425b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * {@code null} to use the theme from the adapter's context 426b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette * @see #getDropDownView(int, View, ViewGroup) 427b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette */ 428b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette @Override 429b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette public void setDropDownViewTheme(Resources.Theme theme) { 430b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette if (theme == null) { 431b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mDropDownInflater = null; 432b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } else if (theme == mInflater.getContext().getTheme()) { 433b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mDropDownInflater = mInflater; 434b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } else { 435b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette final Context context = new ContextThemeWrapper(mContext, theme); 436b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette mDropDownInflater = LayoutInflater.from(context); 437b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 438b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 439b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette 440b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette @Override 441b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette public Resources.Theme getDropDownViewTheme() { 442b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette return mDropDownInflater == null ? null : mDropDownInflater.getContext().getTheme(); 443b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette } 444b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getDropDownView(int position, View convertView, ViewGroup parent) { 447b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette final LayoutInflater inflater = mDropDownInflater == null ? mInflater : mDropDownInflater; 448b9ead4a91599ca63e947f74f83b67a58bda64a82Alan Viverette return createViewFromResource(inflater, position, convertView, parent, mDropDownResource); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new ArrayAdapter from external resources. The content of the array is 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtained through {@link android.content.res.Resources#getTextArray(int)}. 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application's environment. 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textArrayResId The identifier of the array to use as the data source. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResId The identifier of the layout used to create views. 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An ArrayAdapter<CharSequence>. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ArrayAdapter<CharSequence> createFromResource(Context context, 4627b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye @ArrayRes int textArrayResId, @LayoutRes int textViewResId) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence[] strings = context.getResources().getTextArray(textArrayResId); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ArrayAdapter<CharSequence>(context, textViewResId, strings); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Filter getFilter() { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter == null) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = new ArrayFilter(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An array filter constrains the content of the array adapter with 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a prefix. Each item that does not start with the supplied prefix 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is removed from the list.</p> 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ArrayFilter extends Filter { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected FilterResults performFiltering(CharSequence prefix) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FilterResults results = new FilterResults(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues == null) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues = new ArrayList<T>(mObjects); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (prefix == null || prefix.length() == 0) { 49495a78c38373bb99258d83a6ab2c92825d979f200Romain Guy ArrayList<T> list; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 49695a78c38373bb99258d83a6ab2c92825d979f200Romain Guy list = new ArrayList<T>(mOriginalValues); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49895a78c38373bb99258d83a6ab2c92825d979f200Romain Guy results.values = list; 49995a78c38373bb99258d83a6ab2c92825d979f200Romain Guy results.count = list.size(); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefixString = prefix.toString().toLowerCase(); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50395a78c38373bb99258d83a6ab2c92825d979f200Romain Guy ArrayList<T> values; 50495a78c38373bb99258d83a6ab2c92825d979f200Romain Guy synchronized (mLock) { 50595a78c38373bb99258d83a6ab2c92825d979f200Romain Guy values = new ArrayList<T>(mOriginalValues); 50695a78c38373bb99258d83a6ab2c92825d979f200Romain Guy } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50895a78c38373bb99258d83a6ab2c92825d979f200Romain Guy final int count = values.size(); 50995a78c38373bb99258d83a6ab2c92825d979f200Romain Guy final ArrayList<T> newValues = new ArrayList<T>(); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final T value = values.get(i); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String valueText = value.toString().toLowerCase(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First match against the whole, non-splitted value 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueText.startsWith(prefixString)) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newValues.add(value); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] words = valueText.split(" "); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int wordCount = words.length; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 522be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // Start at index 0, in case valueText starts with space(s) 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < wordCount; k++) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (words[k].startsWith(prefixString)) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newValues.add(value); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.values = newValues; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.count = newValues.size(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return results; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void publishResults(CharSequence constraint, FilterResults results) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects = (List<T>) results.values; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.count > 0) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetChanged(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetInvalidated(); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 551