0

我有了一個適配器膨脹兩種佈局(一個用於分離器,一個用於正常的項目),但是當我運行的應用程序,我得到這個在logcat中:ClassCastException異常適配器2個佈局

java.lang.ClassCastException: com.myapp.android.adapter.ModelItemAdapter$ViewHolderSeparator cannot be cast to com.myapp.android.adapter.ModelItemAdapter$ViewHolderItem 
      at com.myapp.android.adapter.ModelItemAdapter.getView(ModelItemAdapter.java:84) 
      at android.widget.AbsListView.obtainView(AbsListView.java:2019) 
      at android.widget.ListView.makeAndAddView(ListView.java:1772) 
      at android.widget.ListView.fillDown(ListView.java:672) 
      at android.widget.ListView.fillGap(ListView.java:636) 
      at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4567) 
      at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:2866) 
      at android.widget.AbsListView.onTouchEvent(AbsListView.java:3121) 
      at android.view.View.dispatchTouchEvent(View.java:5564) 
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2052) 
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1813) 
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2058) 
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827) 
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2058) 
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827) 
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2058) 
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827) 
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2058) 
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1931) 
      at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1390) 
      at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1879) 
      at android.view.View.dispatchPointerEvent(View.java:5766) 
      at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2890) 
      at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2466) 
      at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845) 
      at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2475) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4441) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
      at dalvik.system.NativeStart.main(Native Method) 

這裏是我的代碼:

public class ModelItemAdapter extends ArrayAdapter<ListModelItem> { 

    // == constants == 
    public static final String TAG = ModelItemAdapter.class.getSimpleName(); 

    // == attributes == 
    private final Context context; 
    private final List<ListModelItem> modelsArrayList; 
    private LayoutInflater inflater; 

    // == constructor == 
    public ModelItemAdapter(Context context, ModelItemsList modelItemsList) { 
     super(context, R.layout.list_item_row, modelItemsList.getItems()); 
     this.context = context; 
     this.modelsArrayList = new ArrayList<ListModelItem>(modelItemsList.getItems()); 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 


    // == public methods == 
    @Override 
    public int getCount() { 
     return modelsArrayList.size(); 
    } 

    @Override 
    public ListModelItem getItem(int position) { 
     return modelsArrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return super.getViewTypeCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return super.getItemViewType(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     Log.d(TAG, "pos= " + position + " parent= " + parent); 
     Log.d(TAG, "item= " + getItem(position)); 


     ListModelItem itemAtPos = modelsArrayList.get(position); 


     View rowView = convertView; 
     ViewHolderItem holder; 

     if (!itemAtPos.isParentOrMyObject()) { 


      if (rowView == null) { 
       rowView=inflater.inflate(R.layout.list_item_row, parent, false); 
       holder = new ViewHolderItem(); 

       holder.imgView = (ImageView) rowView.findViewById(R.id.item_icon); 
       holder.titleView = (TextView) rowView.findViewById(R.id.item_title); 
       holder.counterView = (TextView) rowView.findViewById(R.id.item_counter); 
       rowView.setTag(holder); 
      } else { 
       holder = (ViewHolderItem) rowView.getTag(); 
      } 


      Log.d(TAG, "modelType= " + itemAtPos.getModelType()); 

      Integer resIconId = itemAtPos.getIconResId(); 
      Log.d(TAG, "resIconId= " + resIconId); 

      if (itemAtPos.hasIcon()) { 
       holder.imgView.setImageResource(resIconId); 
      } 

      String itemTitle = context.getString(itemAtPos.getDisplayValueResId()); 
      holder.titleView.setText(itemTitle); 
      holder.counterView.setText(itemAtPos.getTotalCountString()); 

     } else { 
      ViewHolderSeparator separator; 
      if (rowView == null) { 
       rowView = inflater.inflate(R.layout.title_item_row, parent, false); 
       separator = new ViewHolderSeparator(); 
       separator.title = (TextView) rowView.findViewById(R.id.header); 
       rowView.setTag(separator); 
      } else { 
       separator = (ViewHolderSeparator) rowView.getTag(); 
      } 

      // assume that it is company. 
      String title = itemAtPos.getCompanyName(); 

      if (itemAtPos.isMyObject()) { 
       title = context.getString(itemAtPos.getDisplayValueResId()); 
      } 

      separator.title.setText(title); 
     } 

     return rowView; 
    } 

    // == view holder == 
    static class ViewHolderItem { 
     ImageView imgView; 
     TextView titleView; 
     TextView counterView; 
    } 

    static class ViewHolderSeparator { 
     TextView title; 
    } 
} 
+0

嘗試清理並重新構建應用程序並再次運行它? – Razgriz 2014-12-01 18:12:09

+0

@Razgriz它再次拋出異常... – 2014-12-01 18:15:19

回答

0

變化getViewTypeCountgetItemViewType象實現:

@Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (getItem(position).isParentOrMyObject()) { 
       return 0; 
     } 
     return 1; 
    } 

這種方式,您將得到兩個型動物convertView。在索引0處的一個,當isParentOrMyObject()返回true時,索引爲1的索引返回false時返回

1

其被附接至再循環視圖(convertView)的視圖保持器不能保證相同類型的在當前位置的項目。例如,視圖+視圖持有者可能是回收的Item,但當前索引位置正試圖膨脹或顯示Separator

您必須檢查回收視圖的項目類型是否與當前項目類型不同,如果視圖不同(如果convertView爲null,則執行相同的操作) 。

或者,您可以切換到一個佈局&一個視圖持有人類,並根據其類型選擇性地隱藏或顯示佈局的某些部分。

+0

你能給我一個例子我怎麼能在代碼中做到這一點? – 2014-12-01 18:30:00