diff options
Diffstat (limited to 'v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowListActivity.java')
-rw-r--r-- | v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowListActivity.java | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowListActivity.java b/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowListActivity.java new file mode 100644 index 000000000..f57ab6ec4 --- /dev/null +++ b/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowListActivity.java @@ -0,0 +1,81 @@ +package com.xtremelabs.robolectric.shadows; + +import android.app.ListActivity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.ListView; +import com.xtremelabs.robolectric.internal.Implementation; +import com.xtremelabs.robolectric.internal.Implements; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Shadow of {@code ListActivity} that supports the retrieval of {@code ListViews} + */ + +@SuppressWarnings({"UnusedDeclaration"}) +@Implements(ListActivity.class) +public class ShadowListActivity extends ShadowActivity { + private ListView listView; + private ListAdapter listAdapter; + + @Implementation + public ListView getListView() { + if (listView == null) { + if ((listView = findListView(getContentView())) == null) { + throw new RuntimeException("No ListView found under content view"); + } + } + return listView; + } + + public void setListView(ListView view) { + listView = view; + } + + @Implementation + public void setListAdapter(ListAdapter listAdapter) { + this.listAdapter = listAdapter; + ListView lv = findListView(getContentView()); + if (lv != null) { + lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + try { + Method handler = realActivity.getClass().getDeclaredMethod("onListItemClick", + ListView.class, View.class, int.class, long.class); + handler.setAccessible(true); + handler.invoke(realActivity, parent, view, position, id); + } catch (NoSuchMethodException ignored) { + } catch (InvocationTargetException ignored) { + } catch (IllegalAccessException ignored) { + } + } + }); + lv.setAdapter(listAdapter); + } + } + + @Implementation + public ListAdapter getListAdapter() { + return listAdapter; + } + + private ListView findListView(View parent) { + if (parent instanceof ListView) { + return (ListView) parent; + } else if (parent instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) parent; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + ListView listView = findListView(viewGroup.getChildAt(i)); + if (listView != null) { + return listView; + } + } + } + return null; + } +} |