Android 活动中的空指针异常

Android 活动中的空指针异常,android,listview,nullpointerexception,Android,Listview,Nullpointerexception,TaskList.java package com.teslaprime.prirt; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.content.Context; import android.content.ContentValues; import android.view.View; import android.view.Vie

TaskList.java

package com.teslaprime.prirt;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.Context;
import android.content.ContentValues;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.widget.ListAdapter;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.LinearLayout;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.Cursor;
import java.util.ArrayList;
import java.util.List;

public class TaskList extends Activity {
  List<Task> tasks = new ArrayList<Task>();
  TaskAdapter adapter = null;
  SQLiteDatabase db = null;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent setupEntry = new Intent (TaskList.this, SetupEntry.class);
    boolean first = checkDatabase() ? true : false;

    db = openOrCreateDatabase("priRT.db",
      SQLiteDatabase.CREATE_IF_NECESSARY,null);
    db.setVersion(1);
    db.setLockingEnabled(true);
    db.execSQL("create table if not exists tasks ("
                + "id integer primary key autoincrement,"
                + "name text,"
                + "time integer,"
                + "type text);");
    db.execSQL("create table if not exists schedule ("
                + "id integer primary key autoincrement,"
                + "hours_free integer);");
    if (first) { startActivityForResult(setupEntry,0); }
    adapter = new TaskAdapter();
    Cursor cur = db.query("tasks",null,null,null,null,null,null);
    cur.moveToFirst();
    while (cur.isAfterLast() == false) {
        Task task = new Task();
        task.name = cur.getString(cur.getColumnIndex("name"));
        task.type = cur.getString(cur.getColumnIndex("type"));
        adapter.add(task);
        cur.moveToNext();
    }
    cur.close();

    Button add = (Button) findViewById(R.id.addTask);
    add.setOnClickListener(onAdd);

    ListView list = (ListView) findViewById(R.id.tasks);

    list.setAdapter(adapter);
    list.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView av, View v, int pos, long id) {
        Task task = adapter.getItem(pos);
        adapter.remove(task);
        db.execSQL("delete from tasks where name = '" + task.name + "';");
      }
    });}

    private boolean checkDatabase() {
        SQLiteDatabase checkDB = null;
          try {
            checkDB = SQLiteDatabase.openDatabase(
               "/data/data/com.teslaprime.prirt/databases/priRT.db", null,
               SQLiteDatabase.OPEN_READONLY);
            checkDB.close();
          } catch (SQLiteException e) {}
          return checkDB == null ? true : false;
   }

  private View.OnClickListener onAdd = new View.OnClickListener() {
    public void onClick(View view) {
      Intent addTask = new Intent (view.getContext(), TaskEntry.class);
      startActivityForResult(addTask, 2);
    }
  };

  protected void onActivityResult(int req, int res, Intent data) {
    if (req == 0 && res == RESULT_OK) {
        Intent setup = new Intent (TaskList.this, Setup.class);
        startActivityForResult(setup, 1);
    }
    if (req == 2 && res == RESULT_OK) {
        Task task = new Task();
        task.name = data.getStringExtra("name");
        task.type = data.getStringExtra("type");
        adapter.add(task);
        ContentValues values = new ContentValues();
        values.put("name", data.getStringExtra("name"));
        values.put("type", data.getStringExtra("type"));
        db.insert("tasks", null, values);
    }
  }

  class TaskAdapter extends ArrayAdapter<Task> {
    TaskAdapter() {super(TaskList.this,R.layout.task,tasks);}
    private List<Task> taskList;
    private Context context;

    public View getView(int pos, View convertView, ViewGroup parent) {
      View task = convertView;
      if (convertView == null) {
        LayoutInflater inflater = getLayoutInflater();
        task = inflater.inflate(R.layout.task,null);
      }

      TextView taskName = (TextView) task.findViewById(R.id.name);
      TextView taskType = (TextView) task.findViewById(R.id.type);
      taskName.setText(tasks.get(pos).name);
      taskType.setText(tasks.get(pos).type);

      return (task);
    }
  }
}

您的
适配器可能是空的


如果您的
任务
表为空,则不会为
适配器
任务设置任何内容。

您的
适配器
可能为空


如果
任务
表为空,则
适配器
任务将不会设置任何内容。

如果此行返回null:

list.setAdapter(adapter);

这意味着您传入的适配器为null或listview为null。使用断点和调试模式找出它是哪一个。

如果此行返回null:

list.setAdapter(adapter);


这意味着您传入的适配器为null或listview为null。使用断点和调试模式找出它是哪个。

问题是第68行是任务列表文件/类。但清单上没有行号。哪一行是68?第68行是list.setAdapter(适配器);好啊这是个谜。我很确定,在ListView list=(ListView)findViewById(R.id.tasks)之后,列表是空的;从资源获取ListView的行。但是,当您成功地从上面的参考资料中获得add按钮时,为什么会这样呢?我注意到的一件事是,您正在XML中使用MATCH_PARENT。如果您切换到填充父项会发生什么情况?我确实相信这就是问题所在,因为这是在xml文件中进行了一次小的编辑之后发生的。。。但是是的,正如你所说,身份证仍然是有定义的。我在所有其他xml文件中都使用了match_parent,自从我读到fill_parent被折旧后就没问题了。Google团队试图将其更改为match_parent。。然而;这并不适用于所有版本的android。默认情况下,应使用“填充父项不匹配父项”。但即使这样,也不应该导致错误。。它会抱怨错误的XML标记,而不是空指针,问题是第68行是任务列表文件/类。但清单上没有行号。哪一行是68?第68行是list.setAdapter(适配器);好啊这是个谜。我很确定,在ListView list=(ListView)findViewById(R.id.tasks)之后,列表是空的;从资源获取ListView的行。但是,当您成功地从上面的参考资料中获得add按钮时,为什么会这样呢?我注意到的一件事是,您正在XML中使用MATCH_PARENT。如果您切换到填充父项会发生什么情况?我确实相信这就是问题所在,因为这是在xml文件中进行了一次小的编辑之后发生的。。。但是是的,正如你所说,身份证仍然是有定义的。我在所有其他xml文件中都使用了match_parent,自从我读到fill_parent被折旧后就没问题了。Google团队试图将其更改为match_parent。。然而;这并不适用于所有版本的android。默认情况下,应使用“填充父项不匹配父项”。但即使这样,也不应该导致错误。。它会抱怨一个坏的XML标记,而不是我认为的空指针。适配器之前工作正常,我没有对它做任何更改,所以我认为这不是问题所在。我看不出listview是如何为空的。。。id是在xml文件中定义的,它与您认为知道的内容无关。请验证它。进入调试模式,查看在该点之前变量是什么。我的xml中有'layout_below=“@id/tasks”,当没有任务时会导致异常:pcoull已经发现通过调试模式,调试模式对解决此类问题非常有帮助。我的建议是使用日志/调试模式的组合来找出这些类型的错误。。。但是,是的,要小心相对布局容易出错。。LOL适配器之前工作正常,我没有对其进行任何更改,所以我认为这不是问题所在。我看不出listview是如何为空的。。。id是在xml文件中定义的,它与您认为知道的内容无关。请验证它。进入调试模式,查看在该点之前变量是什么。我的xml中有'layout_below=“@id/tasks”,当没有任务时会导致异常:pcoull已经发现通过调试模式,调试模式对解决此类问题非常有帮助。我的建议是使用日志/调试模式的组合来找出这些类型的错误。。。但是,是的,要小心相对布局容易出错。。洛威尔。。我的适配器之前工作正常,我没有对它做任何更改,所以我不知道这是怎么回事..你的数据库不知怎么被清空了吗?我一直在尝试,是的,它已经得到了很好的解决。我的xml中有'layout_below=“@id/tasks”,它在没有任务时导致异常:Pwell。。我的适配器之前工作正常,我没有对它做任何更改,所以我不知道这是怎么回事..你的数据库不知怎么被清空了吗?我一直在尝试,是的,它已经得到了很好的解决。我的xml中有'layout_below=“@id/tasks”,它在没有任务时导致异常:P
list.setAdapter(adapter);