1 package org.robolectric.shadows; 2 3 import static org.robolectric.util.reflector.Reflector.reflector; 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.reflector.Direct; 14 import org.robolectric.util.reflector.ForType; 15 16 @SuppressWarnings({"UnusedDeclaration"}) 17 @Implements(AdapterView.class) 18 public class ShadowAdapterView<T extends Adapter> extends ShadowViewGroup { 19 private static int ignoreRowsAtEndOfList = 0; 20 21 @RealObject private AdapterView<T> realAdapterView; 22 23 private AdapterView.OnItemSelectedListener itemSelectedListener; 24 25 @Implementation setOnItemSelectedListener( AdapterView.OnItemSelectedListener itemSelectedListener)26 protected void setOnItemSelectedListener( 27 AdapterView.OnItemSelectedListener itemSelectedListener) { 28 this.itemSelectedListener = itemSelectedListener; 29 reflector(AdapterViewReflector.class, realAdapterView) 30 .setOnItemSelectedListener(itemSelectedListener); 31 } 32 getItemSelectedListener()33 public AdapterView.OnItemSelectedListener getItemSelectedListener() { 34 return itemSelectedListener; 35 } 36 performItemClick(int position)37 public boolean performItemClick(int position) { 38 return realAdapterView.performItemClick( 39 realAdapterView.getChildAt(position), 40 position, 41 realAdapterView.getItemIdAtPosition(position)); 42 } 43 findIndexOfItemContainingText(String targetText)44 public int findIndexOfItemContainingText(String targetText) { 45 for (int i = 0; i < realAdapterView.getCount(); i++) { 46 View childView = realAdapterView.getAdapter().getView(i, null, new FrameLayout(realAdapterView.getContext())); 47 ShadowView shadowView = Shadow.extract(childView); 48 String innerText = shadowView.innerText(); 49 if (innerText.contains(targetText)) { 50 return i; 51 } 52 } 53 return -1; 54 } 55 findItemContainingText(String targetText)56 public View findItemContainingText(String targetText) { 57 int itemIndex = findIndexOfItemContainingText(targetText); 58 if (itemIndex == -1) { 59 return null; 60 } 61 return realAdapterView.getChildAt(itemIndex); 62 } 63 clickFirstItemContainingText(String targetText)64 public void clickFirstItemContainingText(String targetText) { 65 int itemIndex = findIndexOfItemContainingText(targetText); 66 if (itemIndex == -1) { 67 throw new IllegalArgumentException("No item found containing text \"" + targetText + "\""); 68 } 69 performItemClick(itemIndex); 70 } 71 populateItems()72 public void populateItems() { 73 realView.measure(0, 0); 74 realView.layout(0, 0, 100, 10000); 75 } 76 selectItemWithText(String s)77 public void selectItemWithText(String s) { 78 int itemIndex = findIndexOfItemContainingText(s); 79 realAdapterView.setSelection(itemIndex); 80 } 81 82 @ForType(AdapterView.class) 83 interface AdapterViewReflector { 84 85 @Direct setOnItemSelectedListener(AdapterView.OnItemSelectedListener itemSelectedListener)86 void setOnItemSelectedListener(AdapterView.OnItemSelectedListener itemSelectedListener); 87 } 88 } 89