Как получить идентификатор из базы данных при нажатии на элемент listview в Android
-
12-12-2019 - |
Вопрос
Я просмотрел различные вопросы, связанные с этим, на этом веб-сайте, но я не могу решить проблему, с которой я сталкиваюсь.
Я хочу получить идентификатор из базы данных по щелчку элемента listview
Это мой класс категорий:
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
Решение
Вы не запрашиваете _id из базы данных (только столбец KEY_NAME2), поэтому вы не можете получить его из адаптера.
Эта строка:
Cursor cur = (Cursor) parent.getItemAtPosition(position);
это совершенно неправильно.Вы пытаетесь привести строку (которая возвращается с помощью ArrayAdapter<String>
к курсору, который никогда не сможет работать.
Что вам нужно сделать, так это использовать CursorAdapter
(или SimpleCursorAdapter
) для вашего просмотра списка.Курсор должен запрашивать, по крайней мере, _id и KEY_NAME2.
С помощью этого адаптера getItem(int position)
вернет курсор, установленный в запрошенное положение.Тогда все, что вам нужно сделать, это cursor.getInt(cursor.getColumnIndex("_id"))
и ты здесь.