2016-04-13 45 views
0

如果這是重複的,我很抱歉。我仍然對android開發不熟悉,並試圖尋找解決方案,但找不到可行的解決方案。Android - Adapter NullPointerException

我正在創建待辦事宜應用程序並在我的適配器中獲取此錯誤。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String assignment.Model.getAssignment()' on a null object reference 
at assignment.Adapter.getView(Adapter.java:39)  

和代碼,它引用到是

assignment.setText(modelItems[position].getAssignment()); 

我相信,我將它設置爲位置是什麼原因造成的錯誤的行,但我不知道如何修理它。

這裏是我的代碼的其餘部分以供參考:

MainActivity.Java - onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    String assignmentSentBack = data.getStringExtra("editAssignment"); 
    Integer monthSentBack = data.getIntExtra("month", 0); 
    Integer daySentBack = data.getIntExtra("day", 0); 

    modelItems = new Model[100]; 
    ArrayList<Model> modelArrayList = new ArrayList<>(Arrays.asList(modelItems)); 
    modelArrayList.add(new Model(assignmentSentBack, (monthSentBack + 1) + "/" + daySentBack, 0)); 
    lv = (ListView) findViewById(R.id.listAssignment); 
    ListAdapter adapter = new Adapter(this, modelItems); 
    lv.setAdapter(adapter); 
} 

次活動 - onSendActivity(按鈕)

public void onSendAssignment (View view) { 

    EditText editAssignmentET = (EditText) 
      findViewById(R.id.editAssignment); 

    String editAssignment = String.valueOf(editAssignmentET.getText()); 

    DatePicker datePickerDP = (DatePicker) 
      findViewById (R.id.datePicker); 

    Integer month = Integer.valueOf(datePickerDP.getMonth()); 

    Integer day = Integer.valueOf(datePickerDP.getDayOfMonth()); 

    Intent goingBack = new Intent(); 

    goingBack.putExtra("editAssignment", editAssignment); 
    goingBack.putExtra ("month", month); 
    goingBack.putExtra("day", day); 

    setResult(RESULT_OK, goingBack); 

    finish(); 
} 

適配器

public class Adapter extends ArrayAdapter { 

Model[] modelItems = null; 
Context context; 

public Adapter(Context context, Model[] resource) { 
    super(context, R.layout.row, resource); 
    this.context = context; 
    this.modelItems = resource; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.row, parent, false); 
     TextView assignment = (TextView) convertView.findViewById(R.id.assignment); 
     TextView dueDate = (TextView) convertView.findViewById(R.id.dueDate); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox); 
     assignment.setText(modelItems[position].getAssignment()); 
     dueDate.setText(modelItems[position].getDueDate()); 
     if (modelItems[position].getValue() == 1) 
      cb.setChecked(true); 
     else 
      cb.setChecked(false); 

     return convertView; 
    } 
} 

模型

public class Model { 

String assignment; 
String dueDate; 
int value; 

Model (String assignment, String dueDate, int value){ 
    this.assignment = assignment; 
    this.dueDate = dueDate; 
    this.value = value; 
} 

public String getAssignment(){ 
    return this.assignment; 
} 

public String getDueDate(){ 
    return this.dueDate; 
} 

public int getValue(){ 
    return this.value; 
    } 
}  

任何幫助表示讚賞。謝謝。

+0

它,因爲你的'modelItems'只是聲明你沒有給它們分配任何值。 –

回答

0

變化

public class Adapter extends ArrayAdapter { 

public class Adapter extends ArrayAdapter<Model> { 
0

您已經創建大小爲100這裏的模型排列:

modelItems = new Model[100]; 

因此,正在創建100種型號,但所有100個指數具有null值。

那麼你已經創建ArrayList使用數組:

ArrayList<Model> modelArrayList = new ArrayList<>(Arrays.asList(modelItems)); 

所以你再有modelArrayList 100個null對象。哪個BTW你正在使用沒有在哪裏。您正在將modelItems傳遞給構造函數Adapter。所以現在因爲你所有的東西都是null,你會得到這個例外。

嘗試做這樣的事情:

ArrayList<Model> modelArrayList = new ArrayList<>(); 
modelArrayList.add(new Model(assignmentSentBack, (monthSentBack + 1) + "/" + daySentBack, 0)); 

同樣添加這樣的多個模型對象。 將此modelArrayList傳遞到適配器的構造函數中,並使用此(而不是數組)來顯示列表。

lv = (ListView) findViewById(R.id.listAssignment); 
ListAdapter adapter = new Adapter(this, modelArrayList) 

就這樣你的適配器將是這樣的:

ArrayList<Model> modelArrayList; 
Context context; 

public Adapter(Context context, ArrayList<Model> resource) { 
    super(context, R.layout.row, resource); 
    this.context = context; 
    this.modelArrayList = resource; 
} 
2

你應該儘量把它包在內部持有人類別和定義參數在該類

public class Adapter extends ArrayAdapter { 

Model[] modelItems = null; 
Context context; 

public Adapter(Context context, Model[] resource) { 
    super(context, R.layout.row, resource); 
    this.context = context; 
    this.modelItems = resource; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     if (convertView == null) { 
      holder = new ViewHolder(); 

      convertView = vi.inflate(R.layout.list_layout, null); 

      // Find the child views. 
      holder.assignment= (TextView) convertView.findViewById(R.id.txt_name); 
      holder.dueDate= (Button) convertView.findViewById(R.id.btn_invite); 
      holder.cb= (Button) convertView.findViewById(R.id.btn_track); 
      convertView.setTag(holder); 

//.... 

     } 
     // Reuse existing row view 
     else { 
      holder = (ViewHolder)convertView.getTag(); 

     } 

     return convertView; 
    } 
class ViewHolder { 

     TextView assignment; 
TextView dueDate; 
CheckBox cb; 

    } 
} 
相關問題