1 package com.xtremelabs.robolectric.shadows; 2 3 import android.app.ListActivity; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.AdapterView; 7 import android.widget.ListAdapter; 8 import android.widget.ListView; 9 import com.xtremelabs.robolectric.internal.Implementation; 10 import com.xtremelabs.robolectric.internal.Implements; 11 12 import java.lang.reflect.InvocationTargetException; 13 import java.lang.reflect.Method; 14 15 /** 16 * Shadow of {@code ListActivity} that supports the retrieval of {@code ListViews} 17 */ 18 19 @SuppressWarnings({"UnusedDeclaration"}) 20 @Implements(ListActivity.class) 21 public class ShadowListActivity extends ShadowActivity { 22 private ListView listView; 23 private ListAdapter listAdapter; 24 25 @Implementation getListView()26 public ListView getListView() { 27 if (listView == null) { 28 if ((listView = findListView(getContentView())) == null) { 29 throw new RuntimeException("No ListView found under content view"); 30 } 31 } 32 return listView; 33 } 34 setListView(ListView view)35 public void setListView(ListView view) { 36 listView = view; 37 } 38 39 @Implementation setListAdapter(ListAdapter listAdapter)40 public void setListAdapter(ListAdapter listAdapter) { 41 this.listAdapter = listAdapter; 42 ListView lv = findListView(getContentView()); 43 if (lv != null) { 44 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 45 @Override 46 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 47 try { 48 Method handler = realActivity.getClass().getDeclaredMethod("onListItemClick", 49 ListView.class, View.class, int.class, long.class); 50 handler.setAccessible(true); 51 handler.invoke(realActivity, parent, view, position, id); 52 } catch (NoSuchMethodException ignored) { 53 } catch (InvocationTargetException ignored) { 54 } catch (IllegalAccessException ignored) { 55 } 56 } 57 }); 58 lv.setAdapter(listAdapter); 59 } 60 } 61 62 @Implementation getListAdapter()63 public ListAdapter getListAdapter() { 64 return listAdapter; 65 } 66 findListView(View parent)67 private ListView findListView(View parent) { 68 if (parent instanceof ListView) { 69 return (ListView) parent; 70 } else if (parent instanceof ViewGroup) { 71 ViewGroup viewGroup = (ViewGroup) parent; 72 for (int i = 0; i < viewGroup.getChildCount(); i++) { 73 ListView listView = findListView(viewGroup.getChildAt(i)); 74 if (listView != null) { 75 return listView; 76 } 77 } 78 } 79 return null; 80 } 81 } 82