Android 安卓:SimpleCrsorAdapter&;列表视图
嗨,我开始在android(eclipse)上编程一个待办事项列表,它与Google任务同步,并从您的Google帐户添加任务。 我实现了一个非常简单的数据库(根据本教程:)。 项目包含一个活动,该活动仅实现一个listView和一个按钮,该按钮允许项目添加任务。(父活动) 单击按钮,通过“startActivityForResult”启动新的活动,您可以输入名称和类别。(子活动) 然后将这两个字符串传递给父活动并添加到数据库中,该数据库在父活动中初始化 现在,应该创建listview并设置simpleCursorAdapter;在emulator和我的android handy上,这就是应用程序崩溃的地方。 以下是启动活动的代码片段:Android 安卓:SimpleCrsorAdapter&;列表视图,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,嗨,我开始在android(eclipse)上编程一个待办事项列表,它与Google任务同步,并从您的Google帐户添加任务。 我实现了一个非常简单的数据库(根据本教程:)。 项目包含一个活动,该活动仅实现一个listView和一个按钮,该按钮允许项目添加任务。(父活动) 单击按钮,通过“startActivityForResult”启动新的活动,您可以输入名称和类别。(子活动) 然后将这两个字符串传递给父活动并添加到数据库中,该数据库在父活动中初始化 现在,应该创建listview并设置si
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initDB();
initUI();
}
public void initUI()
{
Log.w(TAG, "initUI()");
populateToDoList();
listView = (ListView) findViewById(R.id.tasklist);
addButton = (Button) findViewById(R.id.addTask);
addButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
Intent i = new Intent(RememberMe.this, AddTask.class);
startActivityForResult(i, REQUEST_CODE);
} });
}
public void initDB()
{
toDoDBAdapter = new ToDoDBAdapter(RememberMe.this);
toDoDBAdapter.open();
}
private void populateToDoList()
{
Log.w(TAG, "populateToDoList()");
dbCursor = toDoDBAdapter.getAllToDoItemsCursor();
Log.w(TAG, "getAllToDoItemsCursor()");
startManagingCursor(dbCursor);
Log.w(TAG, "startManagingCursor()");
String [] columns = { ToDoDBAdapter.KEY_NAME};
int [] to = { android.R.id.text1 };
Log.w(TAG, "Sring from int to");
simpleCursor = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, dbCursor, columns, to);
Log.w(TAG, "new SimpleCursorAdapter()");
listView.setAdapter(simpleCursor);
Log.w(TAG, "setAdapter()");
simpleCursor.notifyDataSetChanged();
}
private void updateList()
{
dbCursor.requery();
simpleCursor.notifyDataSetChanged();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(resultCode == REQUEST_CODE)
{
String taskName = data.getStringExtra("taskName");
String taskCategory = data.getStringExtra("taskCategory");
toDoDBAdapter.createTask(taskName, taskCategory);
updateList();
Toast.makeText(this, "Aufgabe hinzugefügt", Toast.LENGTH_LONG).show();
}
}
@Override
public void onDestroy()
{
super.onDestroy();
toDoDBAdapter.close();
}
}
停在
listView.setAdapter(simpleCursor);
Log.w(TAG, "setAdapter()");
我不知道为什么或者是什么问题;我了解到64位系统上的仿真器存在问题,但代码在我的handy和implementing ListView上也不起作用,设置simpleCursor也不应该如此棘手
下面是日志:
您是否已检查以确保listView实际上不为空?调试您的代码,一步一步地升级到
listView.setAdapter(simpleCursor)
并将鼠标悬停在listView上,查看它是否为null
编辑:您确实发现它实际上是空的,以下是我发现的最常见的原因:
listView = (ListView) findViewById(R.id.tasklist);
R.id.tasklist
区分大小写,请确保在XML中它不是@+id/tasklist
或类似内容,否则将返回null
还要确保拼写完全正确,因为这可能只是拼写错误。尝试调试populateToList()中使用的函数的结果首先感谢您的回答,是的,您是对的,它是空的:-$ah好的,我在初始化视图之前运行populateList()。愚蠢的O.oBe一定要选中大的“复选标记”如果这是解决您问题的答案:)。它在左边。感谢您的帮助,我不会单独检查它是否为Null没有问题,这些NullPointerException通常是最容易找到的,您只需使用调试器:)。现在你知道怎么找到一个了。