1package org.robolectric.shadows; 2 3import static org.robolectric.Shadows.shadowOf; 4import static org.robolectric.shadow.api.Shadow.directlyOn; 5 6import android.view.View; 7import android.widget.Adapter; 8import android.widget.AdapterView; 9import android.widget.FrameLayout; 10import org.robolectric.annotation.Implementation; 11import org.robolectric.annotation.Implements; 12import org.robolectric.annotation.RealObject; 13import org.robolectric.util.ReflectionHelpers.ClassParameter; 14 15@SuppressWarnings({"UnusedDeclaration"}) 16@Implements(AdapterView.class) 17public class ShadowAdapterView<T extends Adapter> extends ShadowViewGroup { 18 private static int ignoreRowsAtEndOfList = 0; 19 20 @RealObject 21 private AdapterView<T> realAdapterView; 22 23 private AdapterView.OnItemSelectedListener itemSelectedListener; 24 25 @Implementation 26 public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener itemSelectedListener) { 27 this.itemSelectedListener = itemSelectedListener; 28 directlyOn(realAdapterView, AdapterView.class, "setOnItemSelectedListener", ClassParameter.from(AdapterView.OnItemSelectedListener.class, itemSelectedListener)); 29 } 30 31 public AdapterView.OnItemSelectedListener getItemSelectedListener() { 32 return itemSelectedListener; 33 } 34 35 public boolean performItemClick(int position) { 36 return realAdapterView.performItemClick(realAdapterView.getChildAt(position), 37 position, realAdapterView.getItemIdAtPosition(position)); 38 } 39 40 public int findIndexOfItemContainingText(String targetText) { 41 for (int i = 0; i < realAdapterView.getCount(); i++) { 42 View childView = realAdapterView.getAdapter().getView(i, null, new FrameLayout(realAdapterView.getContext())); 43 String innerText = shadowOf(childView).innerText(); 44 if (innerText.contains(targetText)) { 45 return i; 46 } 47 } 48 return -1; 49 } 50 51 public View findItemContainingText(String targetText) { 52 int itemIndex = findIndexOfItemContainingText(targetText); 53 if (itemIndex == -1) { 54 return null; 55 } 56 return realAdapterView.getChildAt(itemIndex); 57 } 58 59 public void clickFirstItemContainingText(String targetText) { 60 int itemIndex = findIndexOfItemContainingText(targetText); 61 if (itemIndex == -1) { 62 throw new IllegalArgumentException("No item found containing text \"" + targetText + "\""); 63 } 64 performItemClick(itemIndex); 65 } 66 67 public void populateItems() { 68 realView.measure(0, 0); 69 realView.layout(0, 0, 100, 10000); 70 } 71 72 public void selectItemWithText(String s) { 73 int itemIndex = findIndexOfItemContainingText(s); 74 realAdapterView.setSelection(itemIndex); 75 } 76} 77