2015-02-22 3 views
1

У меня есть класс активности, откуда я звоню в адаптер ListView. В классе адаптера у меня есть методы onClick для двух кнопок, которые у меня есть в каждой строке. Когда я нажимаю на одну кнопку, я удалить строку из базы данных, но я должен вызвать метод внутри моей деятельности класса, для того, чтобы обновить пользовательский интерфейс, однако вызывать этот метод так:Вызов метода из другого класса дает NullPointerException

MainActivity main = new MainActivity(); 
main.removeTimer(); 

Бросает NullPointerException. Это мой метод в классе деятельности:

public void removeTimer() { 
    Cursor result1 = myDb.rawQuery("SELECT * from Timers", null); 
    result1.moveToFirst(); 
    timers.clear(); 
    names.clear(); 
    while (result1.isAfterLast() == false) { 
     timers.add(result1.getString(result1.getColumnIndex(TIME_COLUMN))); 
     names.add(result1.getString(result1.getColumnIndex(NAME_COLUMN))); 
     result1.moveToNext(); 
    } 
    timerRow.clear(); 
    for (int i = 0; i < timers.size(); i++) { 
     TimerRow item = new TimerRow(timers.get(i), names.get(i), bRemove, 
       bStartStop); 
     timerRow.add(item); 
    } 
    adapter.notifyDataSetChanged(); 
} 

И он отлично работает, если я назову его внутри класса активности. Это, как я вызываю метод из моего ListViewAdapter класса:

public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    final TimerRow rowItem = getItem(position); 

    LayoutInflater mInflater = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.timer_row, null); 
     holder = new ViewHolder(); 
     // make layout params 
     holder.txtTimer = (TextView) convertView.findViewById(R.id.tvTimes); 
     holder.txtTimer.getLayoutParams().height = height/10; 
     holder.txtName = (TextView) convertView.findViewById(R.id.tvName); 
     holder.txtName.getLayoutParams().height = height/10; 
     holder.bRemove = (Button) convertView.findViewById(R.id.bRemoveTimer); 
     holder.bRemove.getLayoutParams().height = height/10; 
     holder.bStartStop = (Button) convertView 
       .findViewById(R.id.bStartStopTimer); 
     holder.bStartStop.getLayoutParams().height = height/10; 

     convertView.setTag(holder); 

    } else 
     holder = (ViewHolder) convertView.getTag(); 

    holder.txtName.setText(rowItem.getName()); 
    holder.txtTimer.setText(rowItem.getTimer()); 

    holder.bRemove.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      final String name = holder.txtName.getText().toString(); 
      final String timer = holder.txtTimer.getText().toString(); 
      final SQLiteDatabase myDb = context.openOrCreateDatabase("timersDB", NO_SELECTION, null); 
      //final int pos = position; 
      AlertDialog alert; 
      AlertDialog.Builder builder = new AlertDialog.Builder(context); 
      builder.setTitle(R.string.delete_timer); 
      builder.setMessage(context.getString(R.string.want_to_delete) + " " + name 
         + " " + context.getString(R.string.timer2)); 
      builder.setPositiveButton(R.string.delete, 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int id) { 
          myDb.execSQL("DELETE FROM Timers WHERE " 
            + TIME_COLUMN + " = '" + timer 
            + "' AND " + NAME_COLUMN + " = '" 
            + name + "';"); 

          // THIS IS WHERE THE METHOD IS CALLED 
          MainActivity main = new MainActivity(); 
          main.removeTimer(); 

         } 
        }); 
       alert = builder.create(); 
       alert.show(); 
       } 

Это мой журнал:

02-22 17:46:15.300: E/AndroidRuntime(4508): FATAL EXCEPTION: main 
02-22 17:46:15.300: E/AndroidRuntime(4508): Process: com.adrissa.kitchentimer, PID: 4508 
02-22 17:46:15.300: E/AndroidRuntime(4508): java.lang.NullPointerException 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at com.albert.timer.MainActivity.removeTimer(MainActivity.java:115) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at com.albert.timer.CustomTimerRowAdapter$2$2.onClick(CustomTimerRowAdapter.java:272) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at android.os.Handler.dispatchMessage(Handler.java:102) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at android.os.Looper.loop(Looper.java:136) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at android.app.ActivityThread.main(ActivityThread.java:5586) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at java.lang.reflect.Method.invoke(Method.java:515) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
02-22 17:46:15.300: E/AndroidRuntime(4508):  at dalvik.system.NativeStart.main(Native Method) 
+4

Вы не должны делать 'MainActivity mainAct = новый MainActivity();'. Структура обрабатывает создание Activity. – Marcus

+0

Как я могу вызвать метод или, возможно, обновить пользовательский интерфейс из ListViewAdapter? –

ответ

0

Может быть, это потому, что вы вызываете main.removeTimer() вместо mainAct.removeTimer()?

+0

Извините, это была только ошибка типа, вы можете видеть в коде, что это правильно. –

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