我将数据库的数据显示在listview上时,想通过长按listview显示菜单,菜单中包含删除和更新操作,通过长按listview显示菜单,可以通过复写
onCreateContextMenu()onContextItemSelected()方法来实现,这个很简单,在这里就不赘述了,重点在于当我们进行删除操作时,如何删除
这一项,也就是我们需要得到这个item中的数据,比如id,这个id是数据库的id,而不是itemid,这两个是不相同的,因为当我们删除其中的某
一个item时,itemid和数据库的id就会不同。那么我们如何得到数据库的id呢?这里提供五种种方法:
方法一:让listview设置监听器,这里需要提一下,我们最好是设置长按监听器,不然的话,你点击一下,得到了id,然后还要再长按一次,得到菜单,
因为长按只会触发OnItemLongClickListener,不会触发OnItemClickListener,当然你可以让OnItemLongClickListener返回的是false,这样就不会拦截事件了,但是只需要设置一个监听器岂不是更好,所以最好设置长按监听器。然后在其中写入如下代码:
View v=myListView.getChildAt(position);
TextView t=(TextView) v.findViewById(R.id.myTextView1);
itemid=t.getText().toString();
其中的第一行是得到listview中的item的布局,我这里是自定义的布局,用的是linearLayout,这里得到的也就是lineadlayout,第二行是得到
用于显示id的控件,我这里是用的TextView,它的id就是R.id.myTextView1,如果你使用的是系统的布局,那么你的对应的id就是android.R.i d.text1,然后第三行就不用解释了,这样就得到了数据库中的id,当然你还可以得到别的很多数据。
方法二:
listview设置监听器,然后用到游标,在监听器中加入如下代码:
String sql=”select userid from user”;
cursor=sqLiteDatabase.rawQuery(sql, null);
cursor.moveToPosition(position);
int id2=cursor.getInt(cursor.getColumnIndex(“userid”));
这样就得到了这些你所点击的item中的数据库id
方法三:
listview设置监听器,然后写入如下代码:
HashMap<String, String> h1= (HashMap<String, String>) parent.getItemAtPosition(position);
h1.get(“userid”);
这个方法第一行代码得到的是每一个item的值,注意是item的值,这里的itemHashMap结构的。这与第一中方法不同,第一种方法的第一行代码是得到item的布局
第二行代码是取值,因为是HashMap结构的,所以采用这个方式取值,其中"userid"是键。
方法四:
不设置监听器,在onContextItemSelected()方法中写入代码:
AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int q=(int) info.id;
Log.i(“Logcat”, “q=”+q);
View v1= myListView.getChildAt(q);
TextView t2=(TextView) v1.findViewById(R.id.myTextView1);
String st=t2.getText().toString();
这样的到的st就是你的itemid了。
方法五:不设置监听器,在onContextItemSelected()方法中写入代码:
AdapterView.AdapterContextMenuInfo info=(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
String sql=”select userid from user”;
cursor=sqLiteDatabase.rawQuery(sql, null);
cursor.moveToPosition((int) info.id);
int id2=cursor.getInt(cursor.getColumnIndex(“_id”)); 这样就得到了这些你所点击的item中的数据库id。看上述的代码,就会发现这个和方法二类似,方法二的position`就是这里的(int) info.id,
这个方法比方法二更简单,因为不用设置监听器。这个方法最简单。