1 package com.xtremelabs.robolectric.shadows; 2 3 import android.content.Context; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.ArrayAdapter; 7 import android.widget.Filter; 8 import android.widget.TextView; 9 import com.xtremelabs.robolectric.Robolectric; 10 import com.xtremelabs.robolectric.internal.Implementation; 11 import com.xtremelabs.robolectric.internal.Implements; 12 import com.xtremelabs.robolectric.res.ResourceLoader; 13 14 import java.util.ArrayList; 15 import java.util.Arrays; 16 import java.util.List; 17 18 import static com.xtremelabs.robolectric.Robolectric.shadowOf; 19 20 @SuppressWarnings( { "UnusedDeclaration" }) 21 @Implements(ArrayAdapter.class) 22 public class ShadowArrayAdapter<T> extends ShadowBaseAdapter { 23 24 private static final Filter STUB_FILTER = new Filter() { 25 @Override 26 protected FilterResults performFiltering(CharSequence constraint) { 27 return null; 28 } 29 30 @Override 31 protected void publishResults(CharSequence constraint, FilterResults results) { 32 } 33 }; 34 35 private Context context; 36 private List<T> list; 37 private int resource; 38 private int textViewResourceId; 39 private Filter filter; 40 private boolean notifyOnChange = true; 41 getTextViewResourceId()42 public int getTextViewResourceId() { 43 return textViewResourceId; 44 } 45 getResourceId()46 public int getResourceId() { 47 return resource; 48 } 49 __constructor__(Context context, int textViewResourceId)50 public void __constructor__(Context context, int textViewResourceId) { 51 init(context, textViewResourceId, 0, new ArrayList<T>()); 52 } 53 __constructor__(Context context, int resource, int textViewResourceId)54 public void __constructor__(Context context, int resource, int textViewResourceId) { 55 init(context, resource, textViewResourceId, new ArrayList<T>()); 56 } 57 __constructor__(Context context, int textViewResourceId, T[] objects)58 public void __constructor__(Context context, int textViewResourceId, T[] objects) { 59 init(context, textViewResourceId, 0, Arrays.asList(objects)); 60 } 61 __constructor__(Context context, int resource, int textViewResourceId, T[] objects)62 public void __constructor__(Context context, int resource, int textViewResourceId, T[] objects) { 63 init(context, resource, textViewResourceId, Arrays.asList(objects)); 64 } 65 __constructor__(Context context, int textViewResourceId, List<T> objects)66 public void __constructor__(Context context, int textViewResourceId, List<T> objects) { 67 init(context, textViewResourceId, 0, objects); 68 } 69 __constructor__(Context context, int resource, int textViewResourceId, List<T> objects)70 public void __constructor__(Context context, int resource, int textViewResourceId, List<T> objects) { 71 init(context, resource, textViewResourceId, objects); 72 } 73 init(Context context, int resource, int textViewResourceId, List<T> objects)74 private void init(Context context, int resource, int textViewResourceId, List<T> objects) { 75 this.context = context; 76 this.list = objects; 77 this.resource = resource; 78 this.textViewResourceId = textViewResourceId; 79 } 80 81 @Implementation add(T object)82 public void add(T object) { 83 list.add(object); 84 if (notifyOnChange) 85 notifyDataSetChanged(); 86 } 87 88 @Implementation clear()89 public void clear() { 90 list.clear(); 91 if (notifyOnChange) 92 notifyDataSetChanged(); 93 } 94 95 @Implementation remove(T object)96 public void remove(T object) { 97 list.remove(object); 98 if (notifyOnChange) 99 notifyDataSetChanged(); 100 } 101 102 @Implementation insert(T object, int index)103 public void insert(T object, int index) { 104 list.add(index, object); 105 if (notifyOnChange) 106 notifyDataSetChanged(); 107 } 108 109 @Implementation getContext()110 public Context getContext() { 111 return context; 112 } 113 114 @Implementation getCount()115 public int getCount() { 116 return list.size(); 117 } 118 119 @Implementation getItem(int position)120 public T getItem(int position) { 121 return list.get(position); 122 } 123 124 @Implementation getPosition(T item)125 public int getPosition(T item) { 126 return list.indexOf(item); 127 } 128 129 @Implementation getView(int position, View convertView, ViewGroup parent)130 public View getView(int position, View convertView, ViewGroup parent) { 131 T item = list.get(position); 132 View view; 133 134 if (convertView == null) { 135 view = getResourceLoader().inflateView(context,resource, null); 136 } else { 137 view = convertView; 138 } 139 140 TextView text; 141 if (textViewResourceId == 0) { 142 text = (TextView) view; 143 } else { 144 text = (TextView) view.findViewById(textViewResourceId); 145 } 146 147 if (item instanceof CharSequence) { 148 Robolectric.shadowOf(text).setText((CharSequence)item); 149 } else { 150 Robolectric.shadowOf(text).setText(item.toString()); 151 } 152 153 return view; 154 } 155 156 @Implementation getFilter()157 public Filter getFilter() { 158 return STUB_FILTER; 159 } 160 161 @Override 162 @Implementation notifyDataSetChanged()163 public void notifyDataSetChanged() { 164 super.notifyDataSetChanged(); 165 notifyOnChange = true; 166 } 167 168 @Implementation setNotifyOnChange(boolean notifyOnChange)169 public void setNotifyOnChange(boolean notifyOnChange) { 170 this.notifyOnChange = notifyOnChange; 171 } 172 getResourceLoader()173 private ResourceLoader getResourceLoader() { 174 return shadowOf(Robolectric.application).getResourceLoader(); 175 } 176 177 @Implementation createFromResource(Context context, int textArrayResId, int textViewResId)178 public static ArrayAdapter<CharSequence> createFromResource(Context context, int textArrayResId, int textViewResId) { 179 CharSequence[] strings = context.getResources().getTextArray(textArrayResId); 180 return new ArrayAdapter<CharSequence>(context, textViewResId, strings); 181 } 182 }