【问题标题】:Array Adapter NotifyDataSetChanged() NullPointerException Android数组适配器 NotifyDataSetChanged() NullPointerException Android
【发布时间】:2011-08-01 05:48:25
【问题描述】:

我正在将地图添加到列表中,然后刷新数组适配器。这之前工作得很好,但是现在我使用了两个不同方法的 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() 时,它已停止工作。我还检查并确保我从意图中获取的所有字符串都不为空。

【问题讨论】:

    标签: java android android-listview android-adapter


    【解决方案1】:

    onCreate中调用createNewEditedEntry之前需要初始化adapter

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

    否则,adapter 将在从那里调用的addItem 中为空(createNewEditedEntry 的最后一行)。

    【讨论】:

    • 感谢您这么快的回复!我还不能接受答案(它不会让我再等 3 分钟),但我认为它修复了它(我遇到了另一个(不相关的)错误)。
    【解决方案2】:

    您还应该注意,如果您的 Activity 在您处于子 Activity 中时被 Android 销毁,您对 addItem 的调用可能会失败。阅读我对this question 的回答,了解资源不足时会发生什么。

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多