2010-08-23 4 views
2

가능한 경우 구체적으로하려고합니다.이 플랫폼에서 처음으로 질문자이며 비교적 새로운 프로그래밍입니다. 이전에 질문/대답을 한 경우 사과드립니다. 제게 링크 해주세요. 나는 위아래로 수색했지만 다른 관련이없는 (적어도 나에게는) 문제를 찾는다.에뮬레이터의 bindView에서 사용자 정의 커서 커서 어댑터가 충돌 함 - 전화 번호가 아닙니다.

나를위한 진짜 난감한 것은 내 앱이 내 에뮬레이터에서 충돌하는 것입니다.하지만 휴대 전화에 apk를 업로드하고 (시장에서 AppInstaller 앱을 사용하여) 설치하면 작동합니다.

충돌은 사용자 지정 목록 커서 어댑터의 다음 코드 조각 (내 코드)에서 번호 매겨진 줄의 NullPointerException에서 발생합니다.

// TaskListCursorAdapter.java 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 

    super.bindView(view, context, cursor); // <<< LINE 36 
    // DO OTHER BINDING OF STRINGS TO TEXT VIEWS ETC 

다음 오류 덤프가 생성됩니다.

08-23 21:58:57.251: ERROR/AndroidRuntime(346): Uncaught handler: thread main exiting due to uncaught exception 
08-23 21:58:57.411: ERROR/AndroidRuntime(346): java.lang.NullPointerException 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:149) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at adriaansapps.com.tasks.TaskListCursorAdapter.bindView(TaskListCursorAdapter.java:36) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at adriaansapps.com.tasks.TaskListCursorAdapter.newView(TaskListCursorAdapter.java:83) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.CursorAdapter.getView(CursorAdapter.java:182) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.AbsListView.obtainView(AbsListView.java:1274) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1147) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.ListView.onMeasure(ListView.java:1060) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.View.measure(View.java:7964) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:619) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:280) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.View.measure(View.java:7964) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:569) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:361) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.View.measure(View.java:7964) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.View.measure(View.java:7964) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:464) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.View.measure(View.java:7964) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.View.measure(View.java:7964) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.ViewRoot.performTraversals(ViewRoot.java:763) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.os.Looper.loop(Looper.java:123) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at dalvik.system.NativeStart.main(Native Method) 

이상하게도 나는 행복 프로그래밍과 떨어져 하루 종일 디버깅 및 내 응용 프로그램의 긴 작업 및 버그 무료 부분이 지금이 오류를 던졌습니다 갑자기되어 있습니다.

데이터베이스에 문제가있는 것 같지만 확실하지 않습니다. 아무 것도 보이지 않는 것 같습니다. 오늘까지는 단 하나의 테이블 만 가진 데이터베이스가있었습니다. 오늘은 "auto_increment"키 필드로 "_id"필드가있는 새 테이블을 추가했습니다.이 필드는 워드 프로세서에서 읽을 수있는 안드로이드 목록 어댑터 (메모리가있는 경우) . 코딩에 대한 경험과 데이터베이스에 대한 사소한 경험을 가지고있는 것은 나에게 나쁜 생각 인 것 같지만 그게 문제인지 및/또는 어떻게해야하는지에 대해서는 확신 할 수 없습니다.

여기 나열된 충돌은 다른 표에있는 데이터를 표시하거나 참조하지 않습니다. 커서에 쿼리 데이터가 없습니다. 실제로 새 테이블의 "_id"키 필드를 다른 이름 (예 : "_blah")으로 바꾸면 충돌이 발생합니다.

내가 말했듯이, 내가 휴대 전화에 APK를 업로드하면 작동한다. 다시 시작 ADB (이클립스) - - 어떤 결과 를 - 설치 제거를 에뮬레이터에서 - 어떤 결과 - AVD 프로파일을 32 파괴하지 않고 다시 - 어떤 결과

내가 이것을 개발하고을 :

은 내가 에뮬레이터에서 다음을 시도하지 않은 안드로이드 2.1 SDK 하에서, 그리고 지난 몇 주간 계속되었습니다. 나는 그 SDK를 설치 한 적이있다. 아직 2.2로 업데이트하고있다.

내가 여기서 말할 수있는 것이 무엇인지 확신 할 수 없다 - 여기 누군가가 그것에 대해 충분한 지식을 가지고 있기를 바란다.

이 문제를 수정하지 않고도 새로운 코드 변경 사항을 테스트하기 위해 휴대 전화에 업로드해야한다고 가정 할 때 매우 느린 개발 과정을 예상 할 수 있습니다.

오랫동안 바람을 피워 죄송합니다. 저는 여러분에게 똑똑한 사람들 중 한 명에게 충분한 정보를 제공하기를 희망합니다. 감사합니다

답변

1

나는 당신이 .bindView()를 소스 코드를 직접 호출해서는 안된다고 생각합니다.

08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at adriaansapps.com.tasks.TaskListCursorAdapter.bindView(TaskListCursorAdapter.java:36) 
08-23 21:58:57.411: ERROR/AndroidRuntime(346):  at adriaansapps.com.tasks.TaskListCursorAdapter.newView(TaskListCursorAdapter.java:83) 

간단히 ListView.setAdapter (...)과의 ListView /의 GridView의 어댑터를 설정하고 마법이 일어날 수 있습니다 : 당신이 당신의 오류 덤프보고 이런 식으로 할 것 같다.

+0

영업 이익은 체인됩니다에 의해이 튜토리얼을 확인할 수 있습니다. – CommonsWare

+0

흠 - 승자는 radek-k입니다 하지만 왜? 내가 배울 수 있도록 설명 해주고 싶습니다. 나는 이것이 문제라고 생각하지 않았다. (a) 튜토리얼에 있었고, (b) 내 앱이 꽤 오랫동안 잘 돌아 갔기 때문이다. 그러나, 내가 이것을 밖으로 말하고 presto라고 생각하는 킥을 위해, 앱은 지금 행복하게 일하고있다. 나는 또한 여기에 제안을 구현하기 전에 모든 것을 되돌려 놓으려고 노력했으며,이 행은 여전히 ​​주석으로 처리됩니다. 답변? 정당화? 부디? – Adriaan

0

Logcat 로그를 조금 더 자세하게 살펴보십시오.SQL 오류 (노란색으로 표시됨)가있을 수 있으며 모호한 열 이름에 대해 말할 수 있습니다. _id 열을 가져 오려면 마침표가 뒤에 오는 표의 이름을 추가해야 할 수도 있습니다.

이 문제로 인해 어제이 문제가 발생했습니다.

휴대 전화에서 새 테이블을 제대로 만들지 않았기 때문에 휴대 전화에서 발생하지 않는 이유는 무엇입니까? 응용 프로그램 관리를 사용하여 데이터를 지우고 응용 프로그램을 다시 실행하십시오.

당신의 문제가 모호한 열 이름이라는 것을 95 % 확신합니다. 그리고 logcat에서 여러분이 게시 한 오류보다 더 높을 수도 있습니다. 어쩌면 3 줄 이상입니다.

+0

나는 그런 로그 라인을 보지 못했습니다. 나는 또한 테이블 이름을 넣으려고했는데 그 뒤를 바뀌지 않았다. 이제는 ID 코드 인 것으로 보이는 다음과 같은 심판에 관한 몇 줄을 봅니다. 그들은 내 R.id 파일에 존재하지 않습니다. 이상한? – Adriaan

+0

이미 게시 한 오류 위에 logcat을 조금 더 게시 할 수 있습니까? 조금이라도 우리를 도와 줄 수 있습니다. 아주 이상한 오류가 나타날 것 같습니다 – matto1990

+0

- 내 코드에 다시 액세스 할 수 있습니다. 불행히도, 코딩은 나의 일 일이 아니다! : p – Adriaan

0

안드로이드 2.2 소스 코드를 보면, 유일한 방법은 내가 SimpleCursorAdapter의 참조 bindView() 가능성이 생성자에 공급되는 to 배열 null이었다 또는이 Cursor 생성자에 공급하는 경우 null했다 경우 NullPointerException이 제기.

2.2 판의 149 행이 bindView()이 아니기 때문에, SimpleCursorAdapter에는 2.1과 2.2 사이의 몇 가지 변경 사항이 있습니다. 따라서 2.1에서 NullPointerException이 2.2에서 볼 수없는 다른 가능한 경우가있을 수 있습니다.

+0

이 댓글에서 코드 강조 표시에 대해 죄송합니다. 모바일 게시는 기껏해야 어렵습니다. 중단 점이있는 디버그 모드에서 SQL 쿼리에 첨부 된 것처럼 커서가 전달중인 커서가 null로 표시되지 않는 것을 볼 수 있습니다. 내가 null인지를 결정하는 확실한 방법으로 무엇을 찾아야합니까? to 배열이 반드시 null이 아닙니다. R.id. * 항목을 해석 할 수없는 다른 가능성이 있습니까? 마지막 날에 몇 가지 새로운 레이아웃을 추가했는데 ID 이름을 두 배로 늘렸다 고 생각하지 않지만 그렇게 할 수 있습니까? – Adriaan

1

문제점은 getViewTypeCount 및 getViewType 메소드를 대체하지 않는다는 것입니다. 이 메소드를 오버라이드하지 않으면 안드로이드가 getView를 잘못된 유형의 "convertView"매개 변수로 호출하는 경우가 있는데,이 매개 변수를 어댑터의 getView에 전달하면 객체 재사용시 NullPointerException이 발생합니다.

휴대 전화에서 작동하는 이유는 무엇입니까? 확실하지 않습니다, 아마 전화 SimpleCursorAdapter 버전에서 "convertView"매개 변수가 올바른 형식인지 확인합니다. 2.1 에뮬레이터가 작동하지 않지만 1.5, 1.6, 2.2 또는 내 휴대 전화는 작동하지 않습니다.

문제를보다 쉽게 ​​해결하려면 (최적이 아닌) "convertView"매개 변수를 "null"로 SimpleCursorAdapter에 전달할 수 있습니다. 이 방법으로 SimpleCursorAdapter는 어떤 뷰도 결코 재사용하지 않을 것이지만 그것은 모든 장소에서 작동합니다 (에뮬레이터 모든 버전 + 전화).

당신은 완벽하게 합리적이다`의 Bindview()`의 슈퍼 클래스 '구현에 제프 Sharkey의

Separating Lists with Headers in Android 0.9

관련 문제