如何在单击自定义ListView中的列表项时获取数据库的行ID?

时间:2012-02-18 09:30:36

标签: android database android-intent android-listview

我已经定义了一个自定义的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)

3 个答案:

答案 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中重新创建它。 这应该根据您发布的错误日志解决您的问题。