2012-10-18 58 views
1

我想根据位置在BaseAdapter的getView方法中返回2种不同类型的视图。BaseAdapter getView classcastexception

但我得到ClassCastException。以下是我的代码:

public View getView(final int position, View convertView, ViewGroup parent) { 
    if(position != 5){ 

     WebPageView web; 
     if(convertView == null){ 

      web = new WebPageView(mContext, new Point(parent.getWidth(), parent.getHeight()), parent); 

    } else { 
     web = (WebPageView) convertView; 

    } 

     web.setPage("http://yahoo.com"); 
     return web; 
    }else{ 
    final PageView pageView; 
    if (convertView == null) { 
     pageView = new PageView(mContext); 
    } else { 
     pageView = (PageView) convertView; 
    } 


    return pageView; 
} 
} 

但我总是得到ClassCastException。当我在getView中单独使用WebPageView或PageView时,我没有得到异常。

任何人有任何想法?

下面是我的logcat输出。

10-18 18:03:59.250: E/AndroidRuntime(31390): FATAL EXCEPTION: main 
10-18 18:03:59.250: E/AndroidRuntime(31390): java.lang.ClassCastException: com.getit.WebPageView cannot be cast to com.getit.PageView 
10-18 18:03:59.250: E/AndroidRuntime(31390): at com.getit.PageAdapter.getView(PageAdapter.java:94) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at com.getit.CustomGalleryView.getOrCreateChild(CustomGalleryView.java:467) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at com.getit.CustomGalleryView.onLayout(CustomGalleryView.java:422) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.View.layout(View.java:13754) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewGroup.layout(ViewGroup.java:4364) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.View.layout(View.java:13754) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewGroup.layout(ViewGroup.java:4364) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.View.layout(View.java:13754) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewGroup.layout(ViewGroup.java:4364) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.View.layout(View.java:13754) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewGroup.layout(ViewGroup.java:4364) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.View.layout(View.java:13754) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewGroup.layout(ViewGroup.java:4364) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1868) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1689) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.Choreographer.doFrame(Choreographer.java:525) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.os.Handler.handleCallback(Handler.java:615) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.os.Looper.loop(Looper.java:137) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at java.lang.reflect.Method.invokeNative(Native Method) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at java.lang.reflect.Method.invoke(Method.java:511) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-18 18:03:59.250: E/AndroidRuntime(31390): at dalvik.system.NativeStart.main(Native Method) 
+0

你重写getViewTypeCount? – toadzky

+0

请深入一些listview文章,如下所示: - http://www.vogella.com/articles/AndroidListView/article.html它会帮助你开始 –

+0

位置从0开始,如果你想要第5行的位置是4不是5 – noxius

回答

4

,因为你试图回收一个已经转换为另一种object.I一个观点,如果你使用自定义对象或不知道你得到这个错误不是因为如果两者都延伸的公共类它会工作。你可以做两件事情:

1:检查是否convertview是object.This确保您不尝试投浏览量到网页视图或反之亦然

if (convertView == null || !convertView instanceof PageView) { 
    pageView = new PageView(mContext); 
} else { 
    pageView = (PageView) convertView; 
} 

同一支票的WebView藏汉您的自定义的istance 。

2:实例每次一个新对象

if(position != 5){ 
WebPageView web; 
web = new WebPageView(mContext, new Point(parent.getWidth(), parent.getHeight()), parent); 
web.setPage("http://yahoo.com"); 
return web; 
}else{ 
final PageView pageView; 
pageView = new PageView(mContext); 
return pageView; 
} 

不是真的建议,但仍...

+0

让我试试吧。给我10分钟。 –

+0

太棒了!第一个工作真棒。 +1 !!!!!! –

+0

我只有11个声望,所以不能给你+1。 –

相关问题