2017-10-14 23 views
1

我有兩個活動,NewContact.javaViewContact.java,我想使用相同的custom adapter,因爲兩個活動非常相似。java.lang.ClassCastException,嘗試使用相同的自定義適配器有兩個活動

但我收到以下錯誤,我的應用程序崩潰:

AndroidRuntime: FATAL EXCEPTION: main 
java.lang.ClassCastException: com.example.chris.tutorialspoint.ViewContact cannot be cast to com.example.chris.tutorialspoint.NewContact 

我和科目AndroidRuntime: FATAL EXCEPTION:java.lang.ClassCastException這裏看了不少帖子,但我不知道如何調整的答案,以適應我的需求。

這裏是我的適配器的getView代碼。我知道這個問題是與線:

viewHolder.check.setOnCheckedChangeListener((NewContact) _c); 
    viewHolder.check.setOnCheckedChangeListener((ViewContact) _c); 

如果我刪除,則線custom adapter作品剩下的活動之一,但我想有工作兩個活動,NewContactViewContact

@Override 
    public View getView(int i, View convertView, ViewGroup viewGroup) { 
     System.out.println("getView number is :" + i + "convertView is : " + convertView); 
     //we're naming our convertView as view 
     // View view = convertView; 
     ViewHolder viewHolder = null; 

     if (convertView == null) { 

      //if there is nothing there (if it's null) inflate the view with the layout 
      LayoutInflater li = (LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = li.inflate(R.layout.phone_inflate_listview, null); 

      viewHolder = new ViewHolder(); 
      //  So, for example, title is cast to the name id, in phone_inflate_listview, 
      //  phone is cast to the id called no etc 
      viewHolder.title = (TextView) convertView.findViewById(R.id.name); 
      viewHolder.phone = (TextView) convertView.findViewById(R.id.no); 
      viewHolder.invite = (Button) convertView.findViewById(R.id.btnInvite); 
      viewHolder.check = (CheckBox) convertView.findViewById(R.id.checkBoxContact); 
      // viewHolder.check.setVisibility(View.GONE); 

      //remember the state of the checkbox 
      viewHolder.check.setOnCheckedChangeListener((NewContact) _c); 
      viewHolder.check.setOnCheckedChangeListener((ViewContact) _c); 

      convertView.setTag(viewHolder); 

     } else { 

      viewHolder = (ViewHolder) convertView.getTag(); 

     } 
//  store the holder with the view 
     final SelectPhoneContact data = (SelectPhoneContact) arraylist.get(i); 
     //in the listview for contacts, set the name 
     viewHolder.title.setText(data.getName()); 
     //in the listview for contacts, set the number 
     viewHolder.phone.setText(data.getPhone()); 

     ////********************* 

     //for every phone number in the MatchingContactsAsArrayList array list... 
     for (int number = 0; number < MatchingContactsAsArrayList.size(); number++) { 

      //if a phone number is in our array of matching contacts 
      if (MatchingContactsAsArrayList.contains(data.getPhone())) 

      { 
       //if a matching contact, no need to show the Invite button 
       viewHolder.invite.setVisibility(View.GONE); 
       System.out.println("it's a match: phoneNumberofContact is : " + data.getPhone()); 
       //once a matching contact is found, no need to keep looping x number of time, move onto next contact 
       break; 

      } 

      else { 
       //if not a matching contact, no need to show the check box 
       viewHolder.check.setVisibility(View.GONE); 

      } 

     } 


     viewHolder.check.setChecked(data.isSelected()); 



     viewHolder.check.setTag(data); 

     // Return the completed view to render on screen 

     return convertView; 

    } 
+2

如果兩個'Activity'類實現'OnCheckedChangeListener',那麼你只需要一個'setOnCheckedChangeListener()'調用,鑄造'_c'到'OnCheckedChangeListener'。 –

+1

是的。這不好嗎。請張貼的答案,我會很樂意接受。 – CHarris

回答

1

你並不需要強制轉換Context具體Activity類型。該setOnCheckedChangeListener()方法只需要一個OnCheckedChangeListener,如果這兩個類實現這個接口,你只需要一個呼叫鑄ContextOnCheckedChangeListener

viewHolder.check.setOnCheckedChangeListener((OnCheckedChangeListener) _c); 

這可能是謹慎的做法是在構造函數中添加instanceof檢查,以確保傳遞Context確實是一個OnCheckedChangeListener,這將有故障的更快,並且讓您有機會的好處也許拋出Exception與更豐富的信息。

相關問題