我已经定义了一个自定义的itemAdapter类,它从数据库中填充ListView
。我的数据库有大约11列,其中我的列表只显示名称,地址和其他相关详细信息。当我点击列表项时,我的应用程序调用一个intent并启动另一个活动,该活动显示从列表中单击的数据库行的所有详细信息。但我无法让rowid
这样做。我的应用程序总是会出现运行时错误,并询问Force Close
。以下是我的onCreate()
方法的一部分:
ListView lv;
//other parts of code
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
listIntent = new Intent(garageFinder.this,list_detail.class);
Cursor c= (Cursor)itemsAdapter.getItem(position);
listIntent.putExtra("g",c.getInt(c.getColumnIndex("_id")));
startActivity(listIntent);
}
});
为了从意图中检索额外内容我正在使用:
Bundle bundle= getIntent().getExtras();
int id = bundle.getInt("g");
好吧,我按照建议关闭了光标,但仍然存在一些问题。以下是错误日志:
02-18 17:25:43.718: ERROR/AndroidRuntime(526): FATAL EXCEPTION: main
02-18 17:25:43.718: ERROR/AndroidRuntime(526): java.lang.ClassCastException: java.lang.Integer
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at car_app.garage.garageFinder$1.onItemClick(garageFinder.java:82)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.widget.ListView.performItemClick(ListView.java:3382)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.os.Handler.handleCallback(Handler.java:587)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.os.Handler.dispatchMessage(Handler.java:92)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.os.Looper.loop(Looper.java:123)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at android.app.ActivityThread.main(ActivityThread.java:4627)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at java.lang.reflect.Method.invokeNative(Native Method)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at java.lang.reflect.Method.invoke(Method.java:521)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-18 17:25:43.718: ERROR/AndroidRuntime(526): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
public void GetMyRow()//call this method in onCreate()
{
Cursor myDatabaseCursor;
myDatabaseCursor=myDataBaseHelper.fetchMyRowId();
startManagingQuery(myDatabaseCursor);
}
ListView lv;
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
Cursor c=myDatabaseCursor;
c.moveToFirst(position);
listIntent = new Intent(garageFinder.this,list_detail.class);
listIntent.putExtra("g",c.getInt(c.getColumnIndex("_id")));
startActivityForResult(listIntent,Row_id_Request);
}
});
public void onActivityResult(int resquest,int result, Intent intent)
{
switch(request)
{
case Row_id_Request:
Bundle bundle= intent.getExtras();
int id = bundle.getInt("g");
break;
}
}
在您的DataBase类中添加以下代码
public Cursor fetchMyRowid()
{
return db.query(table_name,new String[]{My_Row_ID},null,null,null,null,null);
}
答案 1 :(得分:0)
“完成尚未停用或关闭的光标”
看起来你没有关闭光标。也许你应该在c.close()
返回之前致电onItemClick()
。 (取决于光标的来源。)
然而,你的代码对我来说有点奇怪。如果您要扩展Android CursorAdapter,则传递到id
的{{1}}参数应该已包含您的行ID。如果没有,则有一个onItemClick()
函数。
答案 2 :(得分:0)
根据您的错误日志,它似乎显然是问题,您不关闭数据库。在开始活动时关闭数据库甚至更好:在onPause中关闭数据库并在onResume中重新创建它。 这应该根据您发布的错误日志解决您的问题。