ArrayAdapter.java revision b5d9132d4eaeed13b236501e4af3f99416b4be78
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; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 28c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.util.Comparator; 29c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.util.Collections; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A ListAdapter that manages a ListView backed by an array of arbitrary 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects. By default this class expects that the provided resource id references 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single TextView. If you want to use a more complex layout, use the constructors that 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also takes a field id. That field id should reference a TextView in the larger layout 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * However the TextView is referenced, it will be filled with the toString() of each object in 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the array. You can add lists or arrays of custom objects. Override the toString() method 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of your objects to determine what text will be displayed for the item in the list. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To use something other than TextViews for the array display, for instance, ImageViews, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or to have some of data besides toString() results fill the views, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * override {@link #getView(int, View, ViewGroup)} to return the type of view you want. 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ArrayAdapter<T> extends BaseAdapter implements Filterable { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains the list of objects that represent the data of this ArrayAdapter. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content of this list is referred to as "the array" in the documentation. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<T> mObjects; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Lock used to modify the content of {@link #mObjects}. Any write operation 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * performed on the array should be synchronized on this lock. This lock is also 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used by the filter (see {@link #getFilter()} to make a synchronized copy of 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the original array of data. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Object mLock = new Object(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource indicating what views to inflate to display the content of this 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array adapter. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mResource; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource indicating what views to inflate to display the content of this 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array adapter in a drop down widget. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownResource; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the inflated resource is not a TextView, {@link #mFieldId} is used to find 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a TextView inside the inflated views hierarchy. This field must contain the 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * identifier that matches the one defined in the resource file. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mFieldId = 0; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether or not {@link #notifyDataSetChanged()} must be called whenever 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #mObjects} is modified. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mNotifyOnChange = true; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<T> mOriginalValues; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayFilter mFilter; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutInflater mInflater; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The resource ID for a layout file containing a TextView to use when 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int textViewResourceId) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, textViewResourceId, 0, new ArrayList<T>()); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int resource, int textViewResourceId) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, resource, textViewResourceId, 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 textViewResourceId The resource ID for a layout file containing a TextView to use when 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int textViewResourceId, T[] objects) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, textViewResourceId, 0, Arrays.asList(objects)); 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. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, resource, textViewResourceId, Arrays.asList(objects)); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The resource ID for a layout file containing a TextView to use when 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int textViewResourceId, List<T> objects) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, textViewResourceId, 0, objects); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The current context. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource The resource ID for a layout file containing a layout to use when 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiating views. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResourceId The id of the TextView within the layout resource to be populated 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param objects The objects to represent in the ListView. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(context, resource, textViewResourceId, objects); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds the specified object at the end of the array. 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to add at the end of the array. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void add(T object) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues != null) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.add(object); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects.add(object); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inserts the specified object at the specified index in the array. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to insert into the array. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index The index at which the object must be inserted. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void insert(T object, int index) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues != null) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.add(index, object); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects.add(index, object); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes the specified object from the array. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param object The object to remove. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void remove(T object) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues != null) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.remove(object); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects.remove(object); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove all elements from the list. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear() { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues != null) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues.clear(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects.clear(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 232c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sorts the content of this adapter using the specified comparator. 233c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 234c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param comparator The comparator used to sort the objects contained 235c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * in this adapter. 236c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 237c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void sort(Comparator<? super T> comparator) { 238c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project Collections.sort(mObjects, comparator); 239c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (mNotifyOnChange) notifyDataSetChanged(); 240c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 241c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 242c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataSetChanged() { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.notifyDataSetChanged(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotifyOnChange = true; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Control whether methods that change the list ({@link #add}, 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #insert}, {@link #remove}, {@link #clear}) automatically call 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #notifyDataSetChanged}. If set to false, caller must 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manually call notifyDataSetChanged() to have the changes 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reflected in the attached view. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default is true, and calling notifyDataSetChanged() 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resets the flag to true. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param notifyOnChange if true, modifications to the list will 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically call {@link 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * #notifyDataSetChanged} 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotifyOnChange(boolean notifyOnChange) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotifyOnChange = notifyOnChange; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void init(Context context, int resource, int textViewResourceId, List<T> objects) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mResource = mDropDownResource = resource; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects = objects; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFieldId = textViewResourceId; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the context associated with this array adapter. The context is used 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to create views from the resource passed to the constructor. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The Context associated with this adapter. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Context getContext() { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContext; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.size(); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public T getItem(int position) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.get(position); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the position of the specified item in the array. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param item The item to retrieve the position of. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The position of the specified item. 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPosition(T item) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObjects.indexOf(item); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createViewFromResource(position, convertView, parent, mResource); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View createViewFromResource(int position, View convertView, ViewGroup parent, 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resource) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mInflater.inflate(resource, parent, false); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = convertView; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFieldId == 0) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If no custom field is assigned, assume the whole resource is a TextView 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = (TextView) view; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Otherwise, find the TextView field within the layout 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = (TextView) view.findViewById(mFieldId); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassCastException e) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException( 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ArrayAdapter requires the resource ID to be a TextView", e); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 351b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa T item = getItem(position); 352b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa if (item instanceof CharSequence) { 353b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa text.setText((CharSequence)item); 354b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa } else { 355b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa text.setText(item.toString()); 356b5d9132d4eaeed13b236501e4af3f99416b4be78Daisuke Miyakawa } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the layout resource to create the drop down views.</p> 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resource the layout resource defining the drop down views 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getDropDownView(int, android.view.View, android.view.ViewGroup) 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownViewResource(int resource) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mDropDownResource = resource; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getDropDownView(int position, View convertView, ViewGroup parent) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createViewFromResource(position, convertView, parent, mDropDownResource); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new ArrayAdapter from external resources. The content of the array is 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtained through {@link android.content.res.Resources#getTextArray(int)}. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application's environment. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textArrayResId The identifier of the array to use as the data source. 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param textViewResId The identifier of the layout used to create views. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An ArrayAdapter<CharSequence>. 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ArrayAdapter<CharSequence> createFromResource(Context context, 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int textArrayResId, int textViewResId) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence[] strings = context.getResources().getTextArray(textArrayResId); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ArrayAdapter<CharSequence>(context, textViewResId, strings); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Filter getFilter() { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter == null) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = new ArrayFilter(); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An array filter constrains the content of the array adapter with 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a prefix. Each item that does not start with the supplied prefix 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is removed from the list.</p> 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ArrayFilter extends Filter { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected FilterResults performFiltering(CharSequence prefix) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FilterResults results = new FilterResults(); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOriginalValues == null) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOriginalValues = new ArrayList<T>(mObjects); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (prefix == null || prefix.length() == 0) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mLock) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<T> list = new ArrayList<T>(mOriginalValues); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.values = list; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.count = list.size(); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String prefixString = prefix.toString().toLowerCase(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<T> values = mOriginalValues; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = values.size(); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<T> newValues = new ArrayList<T>(count); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final T value = values.get(i); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String valueText = value.toString().toLowerCase(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // First match against the whole, non-splitted value 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (valueText.startsWith(prefixString)) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newValues.add(value); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] words = valueText.split(" "); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int wordCount = words.length; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < wordCount; k++) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (words[k].startsWith(prefixString)) { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newValues.add(value); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.values = newValues; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results.count = newValues.size(); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return results; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void publishResults(CharSequence constraint, FilterResults results) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObjects = (List<T>) results.values; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.count > 0) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetChanged(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyDataSetInvalidated(); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 474