2013-08-12 3 views
0

это TeacherLoginPage.java, который oncreate устанавливает компоновку с помощью флюированных данных из базы данных. Вот в методе onCreate у меня был присвоен идентификатор проверки коробки с методом setid(). Проблема здесь, когда я нажимаю кнопку обновления, сила приложения закрывается. Я думаю, что линия cbArray.add((CheckBox) findViewById(resId)); не работает. Должен ли я писать как (R.id.resId)?Application force закрывается с ошибкой java.lang.ClassCastException: android.widget.TableRow

TeacherLoginPage.java

LinearLayout my_layout = (LinearLayout) findViewById(R.id.layout_checklist); 

    for (int i = 0; i < Array_Count; i++) { 
     TableRow row = new TableRow(this); 
     row.setId(i); 
     row.setLayoutParams(new LayoutParams(
       android.widget.TableRow.LayoutParams.FILL_PARENT, 
       android.widget.TableRow.LayoutParams.WRAP_CONTENT)); 

     CheckBox checkBox = new CheckBox(this); 

     checkBox.setId(i); 
     checkBox.setText(Roll_array.get(i)); 
     row.addView(checkBox); 
     my_layout.addView(row); 
    } 

public void onClick(View v) { 
     // TODO Auto-generated method stub 

     ArrayList<CheckBox> cbArray = new ArrayList<CheckBox>(); 
     int[] cvalue = null; 
     for (int j = 0; j < Array_Count; j++) { 
      int resId = getResources().getIdentifier(String.valueOf(j), "id", getPackageName()); 
      cbArray.add((CheckBox) findViewById(resId)); 
      cvalue[j] = toNumericalValue(cbArray.get(j).isChecked()); 
     } 
     insertAttendanceDatabase(TeacherLoggedInPage.this, cvalue); 

    } 

    private void insertAttendanceDatabase(
      TeacherLoggedInPage teacherLoggedInPage, int[] cvalue) { 
     // TODO Auto-generated method stub 

     SQLiteDatabase db = myDb.getWritableDatabase(); 

     int length = cvalue.length; 

     ContentValues cv = new ContentValues(); 
     cv.put("teacher_id", t_id); 
     cv.put("time", DateFormat.getDateTimeInstance().format(new Date())); 
     for (int i = 0; i < cvalue.length; i++) { 

      cv.put(Roll_array.get(i), cvalue[i]); 
     } 

     try { 
      db.insert(DbHelper.ATTENDANCE_TABLE, null, cv); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    private int toNumericalValue(boolean checked) { 
     // TODO Auto-generated method stub 
     if (checked) 
      return 1; 
     else 
      return 0; 
    } 

Вот LogCat

08-12 04:17:14.970: D/AndroidRuntime(385): Shutting down VM 
08-12 04:17:14.999: W/dalvikvm(385): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
08-12 04:17:15.009: E/AndroidRuntime(385): FATAL EXCEPTION: main 
08-12 04:17:15.009: E/AndroidRuntime(385): java.lang.ClassCastException: android.widget.TableRow 
08-12 04:17:15.009: E/AndroidRuntime(385): at com.example.attendancesystem.TeacherLoggedInPage.onClick(TeacherLoggedInPage.java:123) 
08-12 04:17:15.009: E/AndroidRuntime(385): at android.view.View.performClick(View.java:2408) 
08-12 04:17:15.009: E/AndroidRuntime(385): at android.view.View$PerformClick.run(View.java:8816) 
08-12 04:17:15.009: E/AndroidRuntime(385): at android.os.Handler.handleCallback(Handler.java:587) 
08-12 04:17:15.009: E/AndroidRuntime(385): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-12 04:17:15.009: E/AndroidRuntime(385): at android.os.Looper.loop(Looper.java:123) 
08-12 04:17:15.009: E/AndroidRuntime(385): at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-12 04:17:15.009: E/AndroidRuntime(385): at java.lang.reflect.Method.invokeNative(Native Method) 
08-12 04:17:15.009: E/AndroidRuntime(385): at java.lang.reflect.Method.invoke(Method.java:521) 
08-12 04:17:15.009: E/AndroidRuntime(385): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-12 04:17:15.009: E/AndroidRuntime(385): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-12 04:17:15.009: E/AndroidRuntime(385): at dalvik.system.NativeStart.main(Native Method) 
08-12 04:17:38.108: I/Process(385): Sending signal. PID: 385 SIG: 9 
+0

Спасибо за все ваши отзывы! Я внес изменения, но теперь он показывает другую ошибку в строке 125 i.e null Указатель Исключение в строке: cvalue [j] = toNumericalValue (cbArray.get (j) .isChecked()); – Shubh

+0

может кто-нибудь сказать мне, как решить эту проблему ?? – Shubh

+0

Вы не инициализировали свой массив int [] cvalue = null; – sandy

ответ

1

Ваша проблема заключается в том, что вы установите ID дважды:

row.setId(i); 

и позже

checkBox.setId(i); 

Что происходит тогда, если вы findViewById(resId) является что он возвращает первый элемент, который он находит с этим идентификатором, который равен TableRow, а не CheckBox, как и ожидалось. Следовательно, ClassCastException.

+0

Спасибо за все ваши отзывы! Я внес изменения, но теперь он показывает еще одну ошибку в строке 125 i.e null Указатель Исключение в строке: cvalue [j] = toNumericalValue (cbArray.get (j) .isChecked()); – Shubh

+0

Либо 'cbArray.get (j)' равно null, либо ваш 'cvalue []' массив по-прежнему равен нулю. Вы забыли инициализировать его? (только догадка) – Terry

1

вы пытаетесь бросить TableRow к CheckBox. Убедитесь, что идентификатор, указывающий на CheckBox

+0

Спасибо за все ваши отзывы! Я внес изменения, но теперь он показывает другую ошибку в строке 125, т.е. нулевой указатель Исключение в строке: cvalue [j] = toNumericalValue (cbArray.get (j) .isChecked()); – Shubh

1

Вот точка, присвоить идентификатор для TableRow раньше, но тогда, когда вы извлекаете из кубовых, вы приводите в CheckBox, которые вызывают проблемы. Проверьте это:

for (int i = 0; i < Array_Count; i++) { 
     TableRow row = new TableRow(this); 
     row.setId(i); 
     row.setLayoutParams(new LayoutParams(
       android.widget.TableRow.LayoutParams.FILL_PARENT, 
       android.widget.TableRow.LayoutParams.WRAP_CONTENT)); 

и это:

ArrayList<CheckBox> cbArray = new ArrayList<CheckBox>(); 
     int[] cvalue = null; 
     for (int j = 0; j < Array_Count; j++) { 
      int resId = getResources().getIdentifier(String.valueOf(j), "id", getPackageName()); 
      cbArray.add((CheckBox) findViewById(resId)); 
      cvalue[j] = toNumericalValue(cbArray.get(j).isChecked()); 
     } 

Надеется, что это помогает.

1

Вы назначаете тот же идентификатор TableRow и Checkbox. в

row.setId(i); 

checkBox.setId(i); 

Просто комментарий //row.setId(i);

+0

Спасибо за все ваши отзывы! Я внес изменения, но теперь он показывает другую ошибку в строке 125, т.е. нулевой указатель Исключение в строке: cvalue [j] = toNumericalValue (cbArray.get (j) .isChecked()); – Shubh

Смежные вопросы