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