android listview ArrayAdapter string cannot be cast to HolderView

1k Views Asked by At

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
1

There are 1 best solutions below

3
On BEST ANSWER

inflate() returns the root layout of your XML view hierarchy. Assuming the root view has the id rowbackground, this line

holder.rw.setTag(menuLinkList.get(position).getId());

overwrites 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.