Home | History | Annotate | Download | only in shadows
      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
     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 
     35     public void setListView(ListView view) {
     36     	listView = view;
     37     }
     38 
     39     @Implementation
     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
     63     public ListAdapter getListAdapter() {
     64         return listAdapter;
     65     }
     66 
     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