2017-10-14 89 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与更丰富的信息。

相关问题