2011-09-15 45 views
0

美好的一天,我在ExpandableListView的上下文菜单中遇到麻烦。我遵循Android网站的例子,但在这一行上得到一个ClassCastException。ContextMenu上的ClassCastException ExpandableListView的项目

String title = ((TextView)info.targetView).getText().toString(); 

这是我的代码,只是发布主要部分。

private class expandableList extends SimpleExpandableListAdapter { 



    public expandableList(Context context, 
     List<? extends Map<String, ?>> groupData, int groupLayout, String[] groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData,int childLayout, String[] childFrom, int[] childTo) { 

    super(context, groupData, groupLayout, groupFrom, groupTo, childData, childLayout, childFrom, childTo); 
      // TODO Auto-generated constructor stub 
     } 
     @Override 
     public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent){ 

final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent); 

     ((TextView)v.findViewById(R.id.search_device_id)).setText((String)((Map<String,Object>)getChild(groupPosition, childPosition)).get(Name)); 

       return v; 
     } 

     @Override 
     public View newChildView(boolean isLastChild, ViewGroup parent){ 
return LayoutInflater.from(getApplicationContext()).inflate(R.layout.search_devices, null); 
     } 
    } 

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo{ 
      super.onCreateContextMenu(menu, v, menuInfo); 

       menu.setHeaderTitle("Devices"); 
       menu.add(0, MENU_HOME, 0, "Home");   
    } 

    public boolean onContextItemSelected(MenuItem menuItem){ 
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)   menuItem.getMenuInfo(); 

     int groupPosition = 0; 
     int childPosition = 0; 
     int type = ExpandableListView.getPackedPositionChild(info.packedPosition); 

     if(type == ExpandableListView.PACKED_POSITION_TYPE_CHILD){ 
    groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
    childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition); 
     }  
     switch(menuItem.getItemId()){ 
     case MENU_HOME: 

      /*classcast exception here on this line*/ 
      String title = ((TextView)info.targetView).getText().toString();  
      Toast.makeText(this, title, Toast.LENGTH_SHORT).show(); 
     } 
     return false; 
    } 

} 

这里是我的Search_devices.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <ImageView 
    android:id="@+id/device_image_id" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/icon"> 
    </ImageView> 

    <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/search_device_id" 
    android:gravity="center_horizontal|bottom" 
    android:textColor="#ffffff" 
    android:padding="2dp"> 
    </TextView> 

</LinearLayout> 

,这是logcat的消息:

09-15 17:17:41.733: ERROR/AndroidRuntime(4729): java.lang.ClassCastException: android.widget.LinearLayout 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.AappDevs.BlueShare.RecentDevices.onContextItemSelected(RecentDevices.java:200) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at android.app.Activity.onMenuItemSelected(Activity.java:2254) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback.onMenuItemSelected(PhoneWindow.java:2903) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:160) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:885) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:137) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:880) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at android.widget.AdapterView.performItemClick(AdapterView.java:284) 

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at android.widget.ListView.performItemClick(ListView.java:3604) 

请任何帮助,将不胜感激感谢。

编辑:这是RecentDevice类的其余部分,这里的一切都包含在它包括expandableList类:

公共类RecentDevices扩展ExpandableListActivity { 公共静态字符串变量=“HOMESHARE”;

TextView device_name; 
ImageView device_image; 
View v; 

//variables for expandablelistview 
final String Name = "name"; 
final String Image = "image"; 

//static variables for context menu order 
static final int MENU_HOME = Menu.FIRST; 


final ArrayList<HashMap<String,String>> headerData = new ArrayList<HashMap<String,String>>(); 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.recent_devices); 

LayoutInflater layoutinflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

//ArrayList of header and child view in expandablelistview 
//final ArrayList<HashMap<String,String>> headerData = new ArrayList<HashMap<String,String>>(); 
final ArrayList<ArrayList<HashMap<String,Object>>> childData = new ArrayList<ArrayList<HashMap<String,Object>>>(); 

//Add data to header 
final HashMap<String,String> group1 = new HashMap<String,String>(); 
group1.put(Name,"Home devices"); 
headerData.add(group1); 

final HashMap<String, String> group2 = new HashMap<String, String>(); 
group2.put(Name, "Work devices"); 
headerData.add(group2); 

//initialise Hashmap for data in child view 
final ArrayList<HashMap<String, Object>> group1data = new ArrayList<HashMap<String,Object>>(); 
childData.add(group1data); 

final ArrayList<HashMap<String, Object>> group2data = new ArrayList<HashMap<String,Object>>(); 
    childData.add(group2data) 

       final HashMap<String, Object> map = new HashMap<String,Object>(); 
        map.put(Name, "Computers"); 

       group1data.add(map); 

      } 
     } 

     //childData.add(group1data); 

     //add data into adapter and show 
     Log.d(TAG, "set expandlistview"); 
     expandableList expand_list = new expandableList(this, headerData, 
      android.R.layout.simple_expandable_list_item_1, new String[]{Name}, new int[]{android.R.id.text1}, 
      (List<? extends List<? extends Map<String, ?>>>) childData, 0, null, new int[]{}); 
    Log.d(TAG, "set expandlistview completed"); 
    setListAdapter(expand_list); 

    registerForContextMenu(getExpandableListView()); 
} 

回答

0

Android的文档状态:

“公共查看的TargetView 自:API等级1

视图为其上下文菜单正在显示,这将是这个ExpandableListView的子视图之一。“

您的ExpandableListView的childView不是TextView,而是封装了整个视图的LinearLayout。您很可能需要抓取整个LinearLayout视图,然后深入研究以获取您要查找的TextView。

事情是这样的:

String title = ((TextView) info.targetView.findViewById(R.id.search_device_id)).getText().toString(); 
+0

哦..非常感谢。缓解了轻微的头痛。很棒! :) – Rexx

0

你ClassCastException异常发生在RecentDevices行200:

09-15 17:17:41.733: ERROR/AndroidRuntime(4729):at com.AappDevs.BlueShare.RecentDevices.onContextItemSelected(RecentDevices.java:200) 
+0

是的,我知道。这是我在问题中提到的路线。但我不知道该怎么做。对我来说没有任何东西跳出来。 – Rexx

+0

似乎'RecentDevices'类是相关的,但是你没有在这里展示它? –

+0

我已经添加了RecentDevices类的剩余代码,我之前发布的所有内容都嵌套在其中。我只是觉得这部分没有必要,这就是为什么我省略了它们,因此更容易阅读。再次感谢 – Rexx