2011-09-15 41 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