Как получить идентификатор из базы данных при нажатии элемента списка в Android

Я искал различные вопросы, связанные с этим на этом веб-сайте, но я не могу решить проблему, которую я получаю.

Я хочу получить идентификатор из базы данных по щелчку элемента списка

Это мой класс категорий:

package com.example.reminders;

import java.util.List;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class Categories extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DBAdapter db = new DBAdapter(Categories.this);
        db.open();
        List<String> cs = db.getAllCategoriesList();
        setListAdapter(new ArrayAdapter<String>(this, R.layout.activity_categories,cs));
        ListView listView = getListView();
        listView.setTextFilterEnabled(true);
        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // When clicked, show a toast with the TextView text

                 Cursor cur = (Cursor) parent.getItemAtPosition(position);
                Toast.makeText(getApplicationContext(),
                "id:"+id+"position:"+position+"rowid:"+cur.getInt(cur.getColumnIndex("_id")), Toast.LENGTH_LONG).show();
            }
        }); 
        db.close();


    }


}

Функция getAllCategoriesList, определенная в классе DBAdapter:

//---retrieves all the category data---
    public List<String> getAllCategoriesList() 
    {
        String[] columns = new String[] {KEY_NAME2};
        Cursor c = db.query(DATABASE_TABLE2, columns, null, null, null, null,
            KEY_NAME2);     
       // String results = "";
        List<String> results = new ArrayList<String>();
        int iCM = c.getColumnIndex(KEY_NAME2);

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            results.add(c.getString(iCM));
        }
        return results;

    }

Когда я запустил код примера, появляется следующая ошибка:

10-01 15:05:22.507: E/AndroidRuntime(20846): java.lang.ClassCastException: java.lang.String cannot be cast to android.database.Cursor

person Pankaj Khurana    schedule 01.10.2012    source источник


Ответы (1)


Вы не запрашиваете _id из базы данных (только столбец KEY_NAME2), поэтому вы не можете получить его из адаптера.

Эта строка:

Cursor cur = (Cursor) parent.getItemAtPosition(position);

совершенно неправильно. Вы пытаетесь привести строку (которая возвращается ArrayAdapter<String> к курсору, который никогда не может работать.

Что вам нужно сделать, это использовать CursorAdapter (или SimpleCursorAdapter) для вашего ListView. Курсор должен запрашивать как минимум _id и KEY_NAME2.

С этим адаптером getItem(int position) вернет курсор, установленный в запрошенную позицию. Тогда все, что вам нужно сделать, это cursor.getInt(cursor.getColumnIndex("_id")) и все готово.

person Bartosz Filipowicz    schedule 01.10.2012
comment
Спасибо Бартош за ответ. Ранее я пробовал подход SimpleCursorAdapter, но он показывает устаревшее предупреждение. Я не углублялся в подход CusrsorAdapter. Так что надо будет разобраться. - person Pankaj Khurana; 01.10.2012
comment
CursorAdapter и SimpleCursorAdapter устарели. - person numediaweb; 05.10.2013
comment
@numediaweb, пожалуйста, объясните. У каждого из них есть конструктор, который устарел, но другие конструкторы допустимы. Может быть, я что-то пропустил. Какие замены? - person Bartosz Filipowicz; 07.10.2013
comment
@BartoszFilipowicz Устарел только конструктор, а не весь класс: stackoverflow.com/questions/8790659/ - person numediaweb; 07.10.2013