In my application, listviews with custom arrayadapter crashes when scrolling the listview and the error is:
06-17 09:01:21.319: E/AndroidRuntime(32453): java.lang.ClassCastException: java.lang.String cannot be cast to SlideMenuListArrayAdapter$ViewHolder
Note that slideMenuAdapter is my custom adapter, i bind it using arraylist of objects. this is the code of getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.slide_menu_item, null, true);
holder = new ViewHolder();
holder.title= (TextView) rowView.findViewById(R.id.title);
holder.image=(ImageView) rowView.findViewById(R.id.icon);
holder.rw = (RelativeLayout)rowView.findViewById(R.id.rowbackground);
ViewResizing.setListRowTextResizing(rowView, context);
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();//crashes here //when scrolling
}
holder.title.setText(menuLinkList.get(position).getTitle());
holder.image.setImageResource(menuLinkList.get(position).getIcon());
holder.rw.setTag(menuLinkList.get(position).getId());
holder.rw.setBackgroundColor(context.getResources().getColor(menuLinkList.get(position).getBackDrawable()));
rowView.setMinimumHeight(MyApplication.screenHeight/8);
return rowView;
}
How can i solve this issue?
this is the entire logcat
06-17 09:01:21.319: E/AndroidRuntime(32453): java.lang.ClassCastException: java.lang.String cannot be cast to com.ids.aldana.adapters.SlideMenuListArrayAdapter$ViewHolder
06-17 09:01:21.319: E/AndroidRuntime(32453): at com.ids.aldana.adapters.SlideMenuListArrayAdapter.getView(SlideMenuListArrayAdapter.java:70)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.AbsListView.obtainView(AbsListView.java:2605)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.ListView.makeAndAddView(ListView.java:1856)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.ListView.fillDown(ListView.java:684)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.ListView.fillGap(ListView.java:648)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:6589)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3703)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.widget.AbsListView.onTouchEvent(AbsListView.java:4553)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.View.dispatchTouchEvent(View.java:7822)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2435)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2159)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2441)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2174)
06-17 09:01:21.319: E/AndroidRuntime(32453): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2326)
06-17 09:01:21.319: E/AndroidRuntime(32453): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1612)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.app.Activity.dispatchTouchEvent(Activity.java:2494)
06-17 09:01:21.319: E/AndroidRuntime(32453): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2274)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.View.dispatchPointerEvent(View.java:8030)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4574)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4462)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4056)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4113)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4082)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4167)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4090)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4224)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4056)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4113)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4082)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4090)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4056)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6224)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6154)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6125)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6304)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:188)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:177)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6277)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6323)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.Choreographer.doCallbacks(Choreographer.java:591)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.Choreographer.doFrame(Choreographer.java:559)
06-17 09:01:21.319: E/AndroidRuntime(32453): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer
inflate()
returns the root layout of your XML view hierarchy. Assuming the root view has the idrowbackground
, this lineoverwrites the viewholder tag with a
String
and recycling the view won't work.You can store additional data such as an id in a view holder field, no need necessarily to put it in a view tag.