2012-10-18 3 views
1

위치에 따라 BaseAdapter의 getView 메소드에서 두 가지 유형의 뷰를 반환하려고합니다.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

다음과 같이 몇 가지 목록보기 기사를 읽어보십시오. - http://www.vogella.com/articles/AndroidListView/article.html 시작하는 데 도움이됩니다 –

+0

위치는 0에서 시작합니다. 원하는 경우 5 번째 행의 위치는 4가됩니다. 5 – noxius

답변

4

당신은 당신이 또는 사용자 정의 개체를 사용하는 경우 모르는 이미 다른 object.I로 캐스팅 된 뷰를 재활용하려고하기 때문에이 오류가 모두이 일 것이다 일반적인 클래스를 확장하고 있지 것처럼

1 : 우선은 2 일을 할 수 확인 convertview가 object.This 당신이 웹보기 aswell을위한 웹보기 또는 viceversa에

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

같은 검사에 페이지 뷰를 캐스팅하려고하지 보장 사용자 정의의 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을 줄 수 없습니다. –