Как получить идентификатор строки базы данных при нажатии на элемент списка в пользовательском ListView? - PullRequest
1 голос
/ 18 февраля 2012

Я определил пользовательский класс 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)

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

"Завершение курсора, который не был деактивирован или закрыт"

Похоже, вы не закрываете курсор.Возможно, вам следует позвонить c.close() до того, как onItemClick() вернется.(Зависит от того, откуда появляется этот курсор.)

Однако ваш код выглядит немного странно для меня.Если вы расширяете Android CursorAdapter , то параметр id, переданный в onItemClick(), должен уже содержать ваш идентификатор строки.Если нет, то есть функция getId(position).

0 голосов
/ 18 февраля 2012

Судя по вашему журналу ошибок, проблема в том, что вы не закрываете базу данных. Закройте базу данных, когда вы начинаете свою деятельность, или даже лучше: закройте свою БД в onPause и заново создайте ее в onResume. Это должно решить вашу проблему согласно журналу ошибок, который вы разместили.

0 голосов
/ 18 февраля 2012
         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);
        }
...