I have an adapter:
public class CustomListAdapter_Words extends BaseAdapter { private static String TAG = "myApplication"; private static String MSG = "Adapter: "; private final Activity context; private final String[][] words_form_1; private final String[][] words_form_2; public CustomListAdapter_Words(Activity context, String[][] words_form_1, String[][] words_form_2) { this.context = context; this.words_form_1 = words_form_1; this.words_form_2 = words_form_2; } static class ViewHolder_form_1 { public TextView textView_1_form_1; public TextView textView_2_form_1; public TextView textView_3_form_1; } static class ViewHolder_form_2 { public TextView textView_1_form_2; public TextView textView_2_form_2; public TextView textView_3_form_2; public TextView textView_4_form_2; public TextView textView_5_form_2; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder_form_1 holder_1; ViewHolder_form_2 holder_2; View rowView_1 = convertView; View rowView_2 = convertView; if (rowView_1 == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView_1 = inflater.inflate(R.layout.row_words_form_1, null, true); holder_1 = new ViewHolder_form_1(); holder_1.textView_1_form_1 = (TextView) rowView_1.findViewById(R.id.text_1); holder_1.textView_2_form_1 = (TextView) rowView_1.findViewById(R.id.text_2); holder_1.textView_3_form_1 = (TextView) rowView_1.findViewById(R.id.text_3); rowView_1.setTag(holder_1); } else { holder_1 = (ViewHolder_form_1) rowView_1.getTag(); } if (rowView_2 == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView_2 = inflater.inflate(R.layout.row_words_form_2, null, true); holder_2 = new ViewHolder_form_2(); holder_2.textView_1_form_2 = (TextView) rowView_2.findViewById(R.id.text_1); holder_2.textView_2_form_2 = (TextView) rowView_2.findViewById(R.id.text_2); holder_2.textView_3_form_2 = (TextView) rowView_2.findViewById(R.id.text_3); holder_2.textView_4_form_2 = (TextView) rowView_2.findViewById(R.id.text_4); holder_2.textView_5_form_2 = (TextView) rowView_2.findViewById(R.id.text_5); rowView_2.setTag(holder_2); } else { holder_2 = (ViewHolder_form_2) rowView_2.getTag(); } if (position < words_form_1.length) { holder_1.textView_1_form_1.setText(words_form_1[position][0]); holder_1.textView_2_form_1.setText(words_form_1[position][1]); holder_1.textView_3_form_1.setText(words_form_1[position][2]); return rowView_1; } else { holder_2.textView_1_form_2.setText(words_form_1[position][0]); holder_2.textView_2_form_2.setText(words_form_1[position][1]); holder_2.textView_3_form_2.setText(words_form_1[position][2]); holder_2.textView_3_form_2.setText(words_form_1[position][3]); holder_2.textView_3_form_2.setText(words_form_1[position][4]); return rowView_2; } } @Override public int getCount() { return words_form_1.length; } @Override public Object getItem(int position) { String[][] item = new String[1][8]; item[0][0] = words_form_1[position][0]; item[0][1] = words_form_1[position][1]; item[0][2] = words_form_1[position][2]; item[0][3] = words_form_2[position][0]; item[0][4] = words_form_2[position][1]; item[0][5] = words_form_2[position][2]; item[0][6] = words_form_2[position][3]; item[0][7] = words_form_2[position][4]; return item; } @Override public long getItemId(int position) { return position; } Here, at performance the error jumps out:
if (rowView_2 == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView_2 = inflater.inflate(R.layout.row_words_form_2, null, true); holder_2 = new ViewHolder_form_2(); holder_2.textView_1_form_2 = (TextView) rowView_2.findViewById(R.id.text_1); holder_2.textView_2_form_2 = (TextView) rowView_2.findViewById(R.id.text_2); holder_2.textView_3_form_2 = (TextView) rowView_2.findViewById(R.id.text_3); holder_2.textView_4_form_2 = (TextView) rowView_2.findViewById(R.id.text_4); holder_2.textView_5_form_2 = (TextView) rowView_2.findViewById(R.id.text_5); rowView_2.setTag(holder_2); } else { holder_2 = (ViewHolder_form_2) rowView_2.getTag(); } An error appears on the line (line 75): holder_2 = (ViewHolder_form_2) rowView_2.getTag();
stacktrace errors:
11-03 15:50:26.301 4800-4800/? E/AndroidRuntimeļ¹ FATAL EXCEPTION: main java.lang.ClassCastException: com.dugin_rostislav.dictionary.CustomListAdapter_Words$ViewHolder_form_1 cannot be cast to com.dugin_rostislav.dictionary.CustomListAdapter_Words$ViewHolder_form_2 at com.dugin_rostislav.dictionary.CustomListAdapter_Words.getView(CustomListAdapter_Words.java:75) at android.widget.AbsListView.obtainView(AbsListView.java:2143) at android.widget.ListView.makeAndAddView(ListView.java:1831) at android.widget.ListView.fillDown(ListView.java:674) at android.widget.ListView.fillGap(ListView.java:638) at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930) at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3087) at android.widget.AbsListView.onTouchEvent(AbsListView.java:3361) at android.view.View.dispatchTouchEvent(View.java:7246) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) at android.app.Activity.dispatchTouchEvent(Activity.java:2410) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) at android.view.View.dispatchPointerEvent(View.java:7426) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171) at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4342) at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4382) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) at android.view.Choreographer.doCallbacks(Choreographer.java:562) at android.view.Choreographer.doFrame(Choreographer.java:530) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5041) 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:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) The application itself crashes when I scroll through the ListView with this adapter, and the first 45 items (no longer fit on the screen) are loaded without failures. The error occurs ONLY when scrolling. The adapter itself receives two two-dimensional arrays of 100 elements each.
What am I doing wrong? Why does the application crash?
With this code:
public class CustomListAdapter_Words extends BaseAdapter { private static String TAG = "myApplication"; private static String MSG = "Adapter: "; private final Activity context; private final String[][] words_form_1; private final String[][] words_form_2; public CustomListAdapter_Words(Activity context, String[][] words_form_1, String[][] words_form_2) { this.context = context; this.words_form_1 = words_form_1; this.words_form_2 = words_form_2; } static class ViewHolder_form_1 { public TextView textView_1_form_1; public TextView textView_2_form_1; public TextView textView_3_form_1; } static class ViewHolder_form_2 { public TextView textView_1_form_2; public TextView textView_2_form_2; public TextView textView_3_form_2; public TextView textView_4_form_2; public TextView textView_5_form_2; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (position < words_form_1.length) { ViewHolder_form_1 holder_1; View rowView_1 = convertView; if (rowView_1 == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView_1 = inflater.inflate(R.layout.row_words_form_1, null, true); holder_1 = new ViewHolder_form_1(); holder_1.textView_1_form_1 = (TextView) rowView_1.findViewById(R.id.text_1); holder_1.textView_2_form_1 = (TextView) rowView_1.findViewById(R.id.text_2); holder_1.textView_3_form_1 = (TextView) rowView_1.findViewById(R.id.text_3); rowView_1.setTag(holder_1); } else { holder_1 = (ViewHolder_form_1) rowView_1.getTag(); } holder_1.textView_1_form_1.setText(words_form_1[position][0]); holder_1.textView_2_form_1.setText(words_form_1[position][1]); holder_1.textView_3_form_1.setText(words_form_1[position][2]); return rowView_1; } else { ViewHolder_form_2 holder_2; View rowView_2 = convertView; if (rowView_2 == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView_2 = inflater.inflate(R.layout.row_words_form_2, null, true); holder_2 = new ViewHolder_form_2(); holder_2.textView_1_form_2 = (TextView) rowView_2.findViewById(R.id.text_1); holder_2.textView_2_form_2 = (TextView) rowView_2.findViewById(R.id.text_2); holder_2.textView_3_form_2 = (TextView) rowView_2.findViewById(R.id.text_3); holder_2.textView_4_form_2 = (TextView) rowView_2.findViewById(R.id.text_4); holder_2.textView_5_form_2 = (TextView) rowView_2.findViewById(R.id.text_5); rowView_2.setTag(holder_2); } else { if(rowView_2.getTag() instanceof ViewHolder_form_2) { holder_2 = (ViewHolder_form_2) rowView_2.getTag(); } else { holder_2 = new ViewHolder_form_2(); } } holder_2.textView_1_form_2.setText(words_form_1[position][0]); //92 ŃŃŃŠ¾ŠŗŠ° holder_2.textView_2_form_2.setText(words_form_1[position][1]); holder_2.textView_3_form_2.setText(words_form_1[position][2]); holder_2.textView_3_form_2.setText(words_form_1[position][3]); holder_2.textView_3_form_2.setText(words_form_1[position][4]); return rowView_2; } } @Override public int getCount() { return (words_form_1.length + words_form_2.length); } @Override public Object getItem(int position) { String[][] item = new String[1][8]; item[0][0] = words_form_1[position][0]; item[0][1] = words_form_1[position][1]; item[0][2] = words_form_1[position][2]; item[0][3] = words_form_2[position][0]; item[0][4] = words_form_2[position][1]; item[0][5] = words_form_2[position][2]; item[0][6] = words_form_2[position][3]; item[0][7] = words_form_2[position][4]; return item; } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType (int position) { return (position < words_form_1.length)?0:1; } @Override public int getViewTypeCount () { return 2; } } The error is this:
11-03 19:52:20.757 1540-1540/? E/MessageQueue-JNIļ¹ java.lang.ArrayIndexOutOfBoundsException: length=100; index=100 at com.dugin_rostislav.dictionary.CustomListAdapter_Words.getView(CustomListAdapter_Words.java:92) at android.widget.AbsListView.obtainView(AbsListView.java:2159) at android.widget.ListView.makeAndAddView(ListView.java:1831) at android.widget.ListView.fillDown(ListView.java:674) at android.widget.ListView.fillGap(ListView.java:638) at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930) at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:3640) at android.view.View.dispatchGenericMotionEventInternal(View.java:7341) at android.view.View.dispatchGenericMotionEvent(View.java:7322) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:1961) at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1415) at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2446) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:1915) at android.view.View.dispatchPointerEvent(View.java:7428) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:125) at android.os.Looper.loop(Looper.java:124) at android.app.ActivityThread.main(ActivityThread.java:5041) 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:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) 11-03 19:52:20.773 1540-1540/? E/AndroidRuntimeļ¹ FATAL EXCEPTION: main java.lang.ArrayIndexOutOfBoundsException: length=100; index=100 at com.dugin_rostislav.dictionary.CustomListAdapter_Words.getView(CustomListAdapter_Words.java:92) at android.widget.AbsListView.obtainView(AbsListView.java:2159) at android.widget.ListView.makeAndAddView(ListView.java:1831) at android.widget.ListView.fillDown(ListView.java:674) at android.widget.ListView.fillGap(ListView.java:638) at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930) at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:3640) at android.view.View.dispatchGenericMotionEventInternal(View.java:7341) at android.view.View.dispatchGenericMotionEvent(View.java:7322) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782) at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735) at android.view.View.dispatchGenericMotionEvent(View.java:7315) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:1961) at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1415) at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2446) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:1915) at android.view.View.dispatchPointerEvent(View.java:7428) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:125) at android.os.Looper.loop(Looper.java:124) at android.app.ActivityThread.main(ActivityThread.java:5041) 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:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)