簡體   English   中英

ClassCastException錯誤,不知道為什么會發生

[英]ClassCastException error, dont know why it occurs

我正在使用BaseAdapter類,當我嘗試投射viewHolder類時,在getView方法中收到ClassCastException錯誤。

這是我的代碼:

public View getView(int position, View convertView, ViewGroup parent){
            // TODO Auto-generated method stub
            NoteItem noteItem = list.get(position);
            TextView tv;
            LinearLayout ll;
            if(convertView == null){
                convertView = inflater.inflate(R.layout.dialog_listitem_note, null);
                ll = (LinearLayout) convertView.findViewById(R.id.llNote);
                tv = (TextView) convertView.findViewById(R.id.tvNoteItem);
                convertView.setTag(new NoteItemViewHolder(tv, ll));
                ll.setOnClickListener(new OnClickListener(){...});
            }else{
                NoteItemViewHolder viewHolder = (NoteItemViewHolder) convertView.getTag(); //ClassCastException error here
                ll = viewHolder.getLl();
                tv = viewHolder.getName();
            }
            tv.setText(noteItem.getName());
            ll.setTag(noteItem);
            ...
            return convertView;
        }  

private class NoteItemViewHolder{

    TextView name;
    LinearLayout ll;

    public NoteItemViewHolder(TextView name, LinearLayout ll){
        this.name = name;
        this.ll = ll;
    }

    public TextView getName(){
        return name;
    }

    public LinearLayout getLl(){
        return ll;
    }       
}

LogCat:

04-16 14:10:04.979: E/AndroidRuntime(23879): FATAL EXCEPTION: main
04-16 14:10:04.979: E/AndroidRuntime(23879): java.lang.ClassCastException: com.calllogimprovementtools.ainius.CallLogView$NoteItem
04-16 14:10:04.979: E/AndroidRuntime(23879):    at com.calllogimprovementtools.ainius.CallLogView$MyNoteAdapter.getView(CallLogView.java:300)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.AbsListView.obtainView(AbsListView.java:1409)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.ListView.makeAndAddView(ListView.java:1745)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.ListView.fillDown(ListView.java:670)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.ListView.fillGap(ListView.java:641)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3407)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.AbsListView.onTouchEvent(AbsListView.java:2237)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.widget.ListView.onTouchEvent(ListView.java:3446)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.View.dispatchTouchEvent(View.java:3885)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1703)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1133)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.app.Dialog.dispatchTouchEvent(Dialog.java:642)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1687)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2196)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.os.Looper.loop(Looper.java:123)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at android.app.ActivityThread.main(ActivityThread.java:3729)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at java.lang.reflect.Method.invokeNative(Native Method)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at java.lang.reflect.Method.invoke(Method.java:507)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
04-16 14:10:04.979: E/AndroidRuntime(23879):    at dalvik.system.NativeStart.main(Native Method)

不知道為什么會發生此錯誤,請提供幫助。

getView方法應該像下面一樣,並且還要檢查控件,例如LinearLayout是否與R.id.yourLinearID綁定

  public View getView(int position, View view, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder;
        if(view == null)
        {
            view = inflater.inflate(R.layout.checkin_item, null);
            holder =  new ViewHolder();

            holder.iconImage = (ImageView)view.findViewById(R.id.chkin_item_iv);
            holder.placeName = (TextView)view.findViewById(R.id.chkin_item_tv_name);

            view.setTag(holder);
        }
        else
        {
            holder = (ViewHolder)view.getTag();
        }

// here need to Bind Require Control      
holder.placeName.setText(googleSetGetArray.getGoogleSetGets().get(position).getName());

        return view;
    }

    class ViewHolder
    {
        ImageView iconImage;
        TextView placeName;         
    }

像這樣使用:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder2;
    View hView = convertView;

    if (convertView == null) {
        holder2 = new ViewHolder();
        hView.setTag(holder2);
    } else {
        holder2 = (ViewHolder) hView.getTag();
    }
}

我解決了錯誤。 問題是我正在設置不同的標簽以將convertView ant轉換為ll(線性布局),即同一視圖,因此當convertView!=nullgetTag()返回NoteItem項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM