天天看點

BaseAdapter的ArrayIndexOutOfBoundsException

原文:http://blog.csdn.net/wulianghuan/article/details/16946019

ANDROID listview BaseAdapter

最近寫一個listView中多個listItem布局時,convertView緩存及使用,類似微信的聊天界面的listView,報了一個異常:

11-25 15:51:49.076: E/InputEventReceiver(22971): Exception dispatching input event.

11-25 15:51:49.128: E/AndroidRuntime(22971): FATAL EXCEPTION: main

11-25 15:51:49.128: E/AndroidRuntime(22971): java.lang.ArrayIndexOutOfBoundsException: length=2; index=3

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6771)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5265)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3232)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3558)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.View.dispatchTouchEvent(View.java:7315)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2253)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1950)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2259)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1964)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2259)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1964)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2259)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1964)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2259)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1964)

11-25 15:51:49.128: E/AndroidRuntime(22971): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1970)

11-25 15:51:49.128: E/AndroidRuntime(22971): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1420)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.app.Activity.dispatchTouchEvent(Activity.java:2444)

11-25 15:51:49.128: E/AndroidRuntime(22971): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1918)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.View.dispatchPointerEvent(View.java:7506)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3680)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3605)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4875)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4835)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4991)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4959)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5013)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.Choreographer.doCallbacks(Choreographer.java:579)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.Choreographer.doFrame(Choreographer.java:546)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.os.Handler.handleCallback(Handler.java:800)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.os.Handler.dispatchMessage(Handler.java:100)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.os.Looper.loop(Looper.java:194)

11-25 15:51:49.128: E/AndroidRuntime(22971): at android.app.ActivityThread.main(ActivityThread.java:5398)

11-25 15:51:49.128: E/AndroidRuntime(22971): at java.lang.reflect.Method.invokeNative(Native Method)

11-25 15:51:49.128: E/AndroidRuntime(22971): at java.lang.reflect.Method.invoke(Method.java:525)

11-25 15:51:49.128: E/AndroidRuntime(22971): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

11-25 15:51:49.128: E/AndroidRuntime(22971): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)

11-25 15:51:49.128: E/AndroidRuntime(22971): at dalvik.system.NativeStart.main(Native Method)

11-25 15:51:49.182: E/AppErrorDialog(590): Failed to get ILowStorageHandle instance

代碼如下:

[java]  view plain copy

BaseAdapter的ArrayIndexOutOfBoundsException
BaseAdapter的ArrayIndexOutOfBoundsException
  1. class FavoriteSmsListAdapter extends BaseAdapter {  
  2.         private Context mContext;  
  3.         private LayoutInflater mInflater;  
  4.         private ArrayList<FavoriteSmsModel> mDataList;  
  5.         public FavoriteSmsListAdapter(Context context) {  
  6.             super();  
  7.             this.mContext = context;  
  8.             this.mInflater = LayoutInflater.from(context);  
  9.         }  
  10.         private void setUpData(ArrayList<FavoriteSmsModel> dataList) {  
  11.             this.mDataList = dataList;  
  12.         }  
  13.         @Override  
  14.         public int getCount() {  
  15.             return mDataList.size();  
  16.         }  
  17.         @Override  
  18.         public Object getItem(int position) {  
  19.             return mDataList.get(position);  
  20.         }  
  21.         @Override  
  22.         public long getItemId(int position) {  
  23.             return position;  
  24.         }  
  25.         @Override  
  26.         public int getItemViewType(int position) {  
  27.             return mDataList.get(position).getType();  
  28.         }  
  29.         @Override  
  30.         public int getViewTypeCount() {  
  31.             return 2;  
  32.         }  
  33.         @Override  
  34.         public View getView(final int position, View convertView, ViewGroup parent) {  
  35.             ViewHolderIn holderIn = null;  
  36.             ViewHolderOut holderOut = null;  
  37.             int type = getItemViewType(position);  
  38.             if(convertView == null)  
  39.             {  
  40.                 switch(type){  
  41.                 case GlobalConstant.TYPE_IN:  
  42.                     convertView = mInflater.inflate(R.layout.favorite_sms_list_item_recv, parent, false);  
  43.                     holderIn = new ViewHolderIn();  
  44.                     holderIn.mFavSmsViewParent = (LinearLayout) convertView.findViewById(R.id.fav_sms_view_parent);  
  45.                     holderIn.mBodyView = (TextView) convertView.findViewById(R.id.body_view);  
  46.                     holderIn.mAddressView = (TextView) convertView.findViewById(R.id.address_view);  
  47.                     holderIn.mDateView = (TextView) convertView.findViewById(R.id.date_view);  
  48.                     convertView.setTag(holderIn);  
  49.                     break;  
  50.                 case GlobalConstant.TYPE_OUT:  
  51.                     convertView = mInflater.inflate(R.layout.favorite_sms_list_item_send, parent, false);  
  52.                     holderOut = new ViewHolderOut();  
  53.                     holderOut.mFavSmsViewParent = (LinearLayout) convertView.findViewById(R.id.fav_sms_view_parent);  
  54.                     holderOut.mBodyView = (TextView) convertView.findViewById(R.id.body_view);  
  55.                     holderOut.mAddressView = (TextView) convertView.findViewById(R.id.address_view);  
  56.                     holderOut.mDateView = (TextView) convertView.findViewById(R.id.date_view);  
  57.                     convertView.setTag(holderOut);  
  58.                     break;  
  59.                 }  
  60.             }else{  
  61.                 switch(type){  
  62.                 case GlobalConstant.TYPE_IN:  
  63.                     holderIn = (ViewHolderIn)convertView.getTag();  
  64.                     break;  
  65.                 case GlobalConstant.TYPE_OUT:  
  66.                     holderOut = (ViewHolderOut)convertView.getTag();  
  67.                     break;  
  68.                 }  
  69.             }  
  70.             FavoriteSmsListItem listItem = (FavoriteSmsListItem) convertView;  
  71.             switch(type){  
  72.             case GlobalConstant.TYPE_IN:  
  73.                 listItem.bind(mContext, mDataList.get(position), holderIn.mFavSmsViewParent, holderIn.mBodyView, holderIn.mAddressView, holderIn.mDateView);  
  74.                 break;  
  75.             case GlobalConstant.TYPE_OUT:  
  76.                 listItem.bind(mContext, mDataList.get(position), holderOut.mFavSmsViewParent, holderOut.mBodyView, holderOut.mAddressView, holderOut.mDateView);  
  77.                 break;  
  78.             }  
  79.             return convertView;  
  80.         }  
  81.     }  
  82.     private class ViewHolderIn {  
  83.         LinearLayout mFavSmsViewParent;  
  84.         TextView mBodyView;  
  85.         TextView mAddressView;  
  86.         TextView mDateView;  
  87.     }  
  88.     private class ViewHolderOut {  
  89.         LinearLayout mFavSmsViewParent;  
  90.         TextView mBodyView;  
  91.         TextView mAddressView;  
  92.         TextView mDateView;  
  93.     }  

我的GlobalConstant.java中定義了type:

[java]  view plain copy

BaseAdapter的ArrayIndexOutOfBoundsException
BaseAdapter的ArrayIndexOutOfBoundsException
  1. public static final int TYPE_IN                         = 3;    // sms type: inbox  
  2.     public static final int TYPE_OUT                        = 4;    // sim of other type  

琢磨了半天,我的getViewTypeCount()傳回的是2,getItemViewType擷取的是type值,同樣是2個,為什麼會報這個錯誤,在網上搜尋到了一個關鍵資訊:

從stackoverflow上看到的回答如下:

The item view type you are returning from getItemViewType() is >= getViewTypeCount().

确實是這個問題,我的type定義了2種,而且是從3開始。。。

講GlobalConstant.java中的type值分别改為0,1,就解決了該問題:

[java]  view plain copy

BaseAdapter的ArrayIndexOutOfBoundsException
BaseAdapter的ArrayIndexOutOfBoundsException
  1. public static final int TYPE_IN                         = 0;    // sms type: inbox  
  2.     public static final int TYPE_OUT    

繼續閱讀