我的代码就在这里.............当从列表视图中删除一行时。列表视图的行的索引已更改,但数据库中的主键ID未更改。现在,当我单击该项目并将列表视图的单击项目的位置传递给新活动时。并尝试检索具有该ID的记录,它不会返回任何内容或返回不正确的数据。现在我的问题是如何检测数据库中listview的单击项的行id。 现在应该是onItemclick方法中的代码,以从数据库中检索正确的行。
感谢反对......!
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDb = new DBHelper(this);
titles = myDb.getAllNames();
times = myDb.getAllTimes();
ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, titles);
lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(ad);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
{
}
});
}
答案 0 :(得分:1)
首先,你必须在数据库中编写一个查询并检索id。你必须在游标中返回id。
请参阅以下代码段:
public Cursor fetchAllNames() {
Cursor mCursor = app.myDbHelper.MyDB().query("cardlist", new String[] {"cardid as _id","cardname","carddesc"},
null, null, null, null, null);
try{
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}catch(Exception e)
{
return mCursor;
}
}
然后在你的java页面中:
Cursor cursor = myDB.fetchAllNames();
然后您可以通过以下方式获取数据库ID:
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
{
if(cursor!=null){
System.out.println("position===>"+position);
if(cursor.moveToFirst()){
cursor.moveToPosition(position);
String cardid = cursor.getString(cursor.getColumnIndex("_id"));
}
}
}
});
您将在字符串cardid中获取数据库ID。如果您使用的是SimpleCursorAdapter,则必须使用 _id ,否则您必须将 _id替换为代表您在sqlite数据库中的ID的列名称。
答案 1 :(得分:1)
有一种简单的方法可以实现: 首先,创建一个对象来表示数据库中的一行。由于我不知道您的数据库包含什么,我们只需将其称为“标题”。
public class Title {
private long id;
private String title;
// Constructor, setters and getters
}
然后,创建一个自定义适配器。它将存储一个Title集合,允许您在单击某个项目时获取它。
public class TitlesAdapter extends ArrayAdapter<Title> {
private Context context;
private List<Title> items;
public TitlesAdapter(Context context, List<Title> items) {
super(context, R.layout.row_draweritem, items);
this.context = context;
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) { /* ... */ }
}
然后,您可以轻松地在活动中设置适配器:
this.titlesAdapter = new TitlesAdapter(context, titles);
listView.setAdapter(this.titlesAdapter);
...并定义你的onItemClickListener,这样你就可以获取数据库中的行id
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
long id = titlesAdapter.getItems().get(i).getId();
}
});
您可以在本文中了解有关自定义适配器的更多信息:http://www.vogella.com/tutorials/AndroidListView/article.html