Адаптер массива NotifyDataSetChanged () NullPointerException Android - PullRequest
0 голосов
/ 01 августа 2011

Я добавляю карту в список, а затем обновляю адаптер массива.Раньше это прекрасно работало, но теперь, когда я использую метод addItem () из двух разных методов, он выбрасывает NullPointer.Я надеюсь, что мой код прояснит то, что я говорю:

SimpleAdapter adapter;
List<HashMap<String, String>> painItems = new ArrayList<HashMap<String, String>>();
ListView listthings;
int[] to;
String[] from;
String painLevelString, timeOfPainString, textTreatmentString,
        painLocation, row1, row2, name;

OnCreate(){
 if(getIntent().getStringExtra("newPainLevel")!= null){
        createNewEditedEntry();

        }
     adapter = new SimpleAdapter(this, painItems, R.layout.mylistlayout,
            from, to);
    listthings.setAdapter(adapter);
}

 private void createNewEditedEntry() {
    String newPainLevel = this.getIntent().getStringExtra("newPainLevel");
    String newPainTime =this.getIntent().getStringExtra("newPainTime");
    String newTreatment =this.getIntent().getStringExtra("newTreatment");
    painLevelString = newPainLevel;
    timeOfPainString = newPainTime;
    textTreatmentString = newTreatment;
    row1 = "sample1";
    row2 = "sample2";

    addItem();
    //painItems.remove(getIntent().getStringExtra("position"));
    //adapter.notifyDataSetChanged();

 }

@Override
// on the activityresult,get the string extra, then add the item to the list
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == 1) {
        row1 = data.getStringExtra("com.painLogger.row1");
        row2 = data.getStringExtra("com.painLogger.row2");


        painLevelString = data.getStringExtra("com.painLogger.painLevel");
        painLocation = data.getStringExtra("painLocation");
        timeOfPainString = data.getStringExtra("com.painLogger.painTime");
        textTreatmentString = data
                .getStringExtra("com.painLogger.treatment");
        addItem();
    }
}

// to add the item, put it in the map, and add the map into the list
private void addItem() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("row_1", row1);
    map.put("row_2", row2);
    map.put("row_3", painLevelString);
    map.put("row_4", painLocation);
    map.put("row_5", timeOfPainString);
    map.put("row_6",textTreatmentString);
    painItems.add(map);
        adapter.notifyDataSetChanged(); //Null Pointer **HERE**
    }

Для ясности, createNewEditedEntry () и onActivityResult () никогда не вызываются одновременно и никогда не конфликтуют.Это два совершенно разных случая.Он работал только с OnActivityResult, но теперь, когда я использую CreateNewEditedEntry (), он перестал работать.Я также проверил и убедился, что ни одна из строк, которые я извлекаю из своего намерения, не является нулевой.

Ответы [ 2 ]

4 голосов
/ 01 августа 2011

Вам нужно инициализировать adapter перед вызовом createNewEditedEntry в onCreate:

OnCreate(){
     adapter = new SimpleAdapter(this, painItems, R.layout.mylistlayout, from, to);
      if(getIntent().getStringExtra("newPainLevel")!= null){
        createNewEditedEntry();    
      }
// ...
}

В противном случае adapter будет нулевым в addItem, вызванном оттуда (последняя строка createNewEditedEntry).

0 голосов
/ 28 апреля 2013

Вы также должны знать, что ваш вызов addItem может завершиться ошибкой, если ваша активность была разрушена Android, когда вы находились в подоперации.Прочитайте мой ответ на этот вопрос , чтобы понять, что может случиться, когда ресурсы истощатся.

...