2016-04-13 95 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; 

    } 
} 
相关问题