【问题标题】:How to get row id of database on clicking a list item in a custom ListView?如何在单击自定义 ListView 中的列表项时获取数据库的行 ID?
【发布时间】:2012-02-18 09:30:35
【问题描述】:

我定义了一个自定义 itemAdapter 类,它从数据库中填充我的ListView。我的数据库有大约 11 列,其中我的列表仅显示姓名、地址和其他相关详细信息。当我单击列表项时,我的应用程序调用一个意图并启动另一个活动,该活动显示从列表中单击的数据库行的所有详细信息。但我无法让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)

【问题讨论】:

  • 乍一看似乎还可以。你能贴一下强制关闭的日志吗
  • 我发布了导致 d 问题的 d 日志。

标签: android database android-intent android-listview


【解决方案1】:
         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;
          } 
       }

在您的数据库类中添加以下代码

       public Cursor fetchMyRowid()
       {
          return db.query(table_name,new String[]{My_Row_ID},null,null,null,null,null);
        }

【讨论】:

  • 谢谢。但问题依然存在
【解决方案2】:

根据您的错误日志,问题显然是您没有关闭数据库。开始活动时关闭数据库,甚至更好:在 onPause 中关闭数据库并在 onResume 中重新创建它。 根据您发布的错误日志,这应该可以解决您的问题。

【讨论】:

    【解决方案3】:

    “完成一个尚未停用或关闭的游标”

    看起来您没有关闭光标。也许你应该在onItemClick() 返回之前调用c.close()。 (取决于该光标的来源。)

    但是,您的代码对我来说有点奇怪。如果您正在扩展 Android CursorAdapter,则传递给 onItemClick() 的 id 参数应该已经包含您的行 ID。如果没有,有一个getId(position) 函数。

    【讨论】:

    • 你能告诉我如何扩展 CursorAdapter 吗? onItemClick 中的 id 参数始终返回 0 作为值。
    • 其实我只是使用SimpleCursorAdapter -- 不需要扩展它,因为它已经实现了 CursorAdapter -- 而且我的 ListActivity.onListItemClick() 可以很好地传递 id。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多