2013-04-06 15 views
1

我正在爲事件構建應用程序,其中一個功能是留言板。爲此,我構建了一個ListView並加載了消息。具有多個項目類型的ListAdapter拋出ClassCastException

我有兩種類型的消息:你發送的消息和另一個發送的消息。佈局略有不同,U使用其他XML文件。我試過我的代碼(下面),如果所有項目都是相同類型的(你的或其他),它就可以正常工作。但是當類型改變時,我得到ClassCastException。我知道這意味着什麼,以及它出錯的地方(商品持有者是不同的類別,它試圖使類別的對象不是),而不是如何解決它。

這是我的代碼,這是我的ChatAdapter的getView。 ChatAdapter是延伸BaseAdapter的類。

public View getView(final int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    final Message m = messagelist.get(position); 
    OwnMessageHolder ownMessageHolder; 
    OtherMessageHolder otherMessageHolder; 
    if(isSelf(m.getPerson().getId())) { 
    if (vi == null) { //convertview==null 
     ownMessageHolder = new OwnMessageHolder(); 
     vi = inflater.inflate(R.layout.listitem_chat_own, null); 
     vi.setOnClickListener(null); 
     vi.setOnLongClickListener(null); 
     vi.setLongClickable(false); 
     ownMessageHolder.name = (TextView) vi.findViewById(R.id.tv_chat_own_name); 
     ownMessageHolder.message = (TextView) vi.findViewById(R.id.tv_chat_own_message); 
     vi.setTag(ownMessageHolder); 
    }else{//convertview is not null 
     ownMessageHolder = (OwnMessageHolder)vi.getTag(); 
    } 

    ownMessageHolder.name.setText(m.getPerson().getName()); 
    ownMessageHolder.message.setText(m.getMessages()[0]); 

    vi.setFocusable(false); 
    vi.setClickable(true); 

    return vi; 
    }else {//other 
     if (vi == null) { //convertview==null 
      otherMessageHolder = new OtherMessageHolder(); 
      vi = inflater.inflate(R.layout.listitem_chat_other, null); 
      vi.setOnClickListener(null); 
      vi.setOnLongClickListener(null); 
      vi.setLongClickable(false); 
      otherMessageHolder.name = (TextView) vi.findViewById(R.id.tv_chat_other_name); 
      otherMessageHolder.message = (TextView) vi.findViewById(R.id.tv_chat_other_message); 
      vi.setTag(otherMessageHolder); 
     }else{//convertview is not null 
      otherMessageHolder = (OtherMessageHolder)vi.getTag(); 
     } 


     otherMessageHolder.name.setText(m.getPerson().getName()); 
     otherMessageHolder.message.setText(m.getMessages()[0]); 

     vi.setFocusable(false); 
     vi.setClickable(true); 

     return vi; 
    } 
} 


    public static class OwnMessageHolder { 
    public TextView name; 
    public TextView message; 
} 

public static class OtherMessageHolder { 
    public TextView name; 
    public TextView message; 
} 

和錯誤日誌:

04-06 23:25:54.720: E/AndroidRuntime(18176): FATAL EXCEPTION: main 
04-06 23:25:54.720: E/AndroidRuntime(18176): java.lang.ClassCastException: com.hera.lustrumvirgiel.ChatAdapter$OtherMessageHolder cannot be cast to com.hera.lustrumvirgiel.ChatAdapter$OwnMessageHolder 
04-06 23:25:54.720: E/AndroidRuntime(18176): at com.hera.lustrumvirgiel.ChatAdapter.getView(ChatAdapter.java:57) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.AbsListView.obtainView(AbsListView.java:2449) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.ListView.measureHeightOfChildren(ListView.java:1244) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.ListView.onMeasure(ListView.java:1155) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.View.measure(View.java:12815) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.RelativeLayout.measureChild(RelativeLayout.java:627) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:440) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.View.measure(View.java:12815) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.View.measure(View.java:12815) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1399) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.LinearLayout.measureVertical(LinearLayout.java:690) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.LinearLayout.onMeasure(LinearLayout.java:583) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.View.measure(View.java:12815) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2106) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.View.measure(View.java:12815) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1068) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2452) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.os.Looper.loop(Looper.java:137) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at android.app.ActivityThread.main(ActivityThread.java:4493) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at java.lang.reflect.Method.invokeNative(Native Method) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at java.lang.reflect.Method.invoke(Method.java:511) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
04-06 23:25:54.720: E/AndroidRuntime(18176): at dalvik.system.NativeStart.main(Native Method) 

任何人知道如何解決這個問題?錯誤日誌所指的是(57)這一行是:

ownMessageHolder =(OwnMessageHolder)vi.getTag();

在此先感謝!

回答

4

您正在嘗試使用多種佈局:

vi = inflater.inflate(R.layout.listitem_chat_own, null); 
vi = inflater.inflate(R.layout.listitem_chat_other, null); 

但你沒有告訴適配器期望不止一個...這將導致ListView的RecycleBin出現很多問題,並且效率不高。只需覆蓋getViewTypeCount()getItemViewType(),然後在getView()內使用getItemViewType()加載合適的佈局,然後適配器將負責其餘部分。

3

爪哇的instanceof關鍵字似乎是你在找什麼。它允許您確定對象是否是特定類的實例。這是特別方便,鑄造對象之前在if語句中使用:

Object tag = vi.getTag(); 
if (tag instanceof OtherMessageHolder) 
    otherMessageHolder = (OtherMessageHolder)tag; 
else // Assume it is an OwnMessageHolder 
    ownMessageHolder = (OwnMessageHolder)tag; 
相關問題