我正在构建一个简单的待办事项/任务应用程序,其中任务以循环器/卡视图布局呈现,并且在选择任务时,用户被视为该特定任务的“详细”视图。我正在使用Genymotion模拟器测试我的应用程序。我的问题是应用程序在启动时立即崩溃了NPE。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.api.client.util.DateTime.toString()' on a null object reference
at com.github.idclark.forgetmenot.TaskAdapter.onBindViewHolder(TaskAdapter.java:35)
at com.github.idclark.forgetmenot.TaskAdapter.onBindViewHolder(TaskAdapter.java:17)
虽然我不完全确定,但我认为这是因为我还没有在数据库中输入任何数据。首先从我的Main活动膨胀的片段中查询数据库。
public static class PlaceholderFragment extends Fragment {
Activity mActivity;
RecyclerView mRecyclerView;
TaskAdapter taskAdapter;
AddFloatingActionButton mFabView;
CheckBox mCheckBox;
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.cardList);
mFabView = (AddFloatingActionButton) rootView.findViewById(R.id.normal_plus);
mFabView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent createTaskIntent = new Intent(v.getContext(), EditActivity.class);
startActivity(createTaskIntent);
}
});
taskAdapter = new TaskAdapter(new TaskTableController(getActivity()).getAllTasksForUser());
return rootView;
}
我的TaskAdapter
需要ArrayList<Task>
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {
private List<Task> taskList;
OnItemClickListener mItemClickListener;
public TaskAdapter(List<Task> taskList) {
this.taskList = taskList;
}
@Override
public int getItemCount() {
return taskList.size();
}
@Override
public void onBindViewHolder(TaskViewHolder taskViewHolder, int i) {
Task task = taskList.get(i);
taskViewHolder.mTitle.setText(task.getTitle());
taskViewHolder.mUpdated.setText(task.getUpdated().toString());
if (task.getStatus().equals("completed")) {
taskViewHolder.mStatus.setChecked(true);
} else taskViewHolder.mStatus.setChecked(false);
}
@Override
public TaskViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).
inflate(R.layout.tasklist_layout, viewGroup, false);
return new TaskViewHolder(itemView);
}
对数据库的实际查询类似于
public List<Task> getAllTasksForUser() {
final String QUERY_ALL_RECORDS = "SELECT * FROM " + TaskEntry.TABLE_NAME;
List<Task> taskList = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(QUERY_ALL_RECORDS, null);
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
Task task = new Task();
int TaskId = cursor.getColumnIndex(TaskEntry.COLUMN_TASK_ID);
task.setId(cursor.getString(TaskId));
task.setTitle(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_TITLE)));
task.setDue(new DateTime(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_DUE))));
task.setNotes(cursor.getString(cursor.getColumnIndex(TaskEntry.COLUMN_TASK_NOTES)));
taskList.add(task);
}
} else return taskList;
db.close();
return taskList;
}
当应用程序首次安装在模拟器上时,数据库中没有数据,我认为这是导致NPE的原因。我如何处理这种情况,以便如果没有数据我的片段只显示一个空列表(即空白)。我已经检查cursor.getCount()
是否大于0,如果它没有向适配器返回一个空列表。我错过了什么来摆脱这个NPE?
答案 0 :(得分:2)
崩溃最有可能发生在以下一行:
taskViewHolder.mUpdated.setText(task.getUpdated().toString());
task.getUpdate()
返回null,您的应用崩溃了。
我不知道你在哪里调用setUpdated。可能是你的一个安装者做了那个,或者你可能忘记在你的代码中放置一个setter。
有点不相关的说明:如果您的任务列表为空,则不要关闭光标和数据库。