怎么得到listview长按事件中按的是哪个条目?用这个方法不行啊

just4rmb 2012-08-04 09:33:32
在处理android中listview的长按事件中,我需要知道长按的是哪个条目,用了网上的一个方法,理应成功,却没有成功,贴出来请教一下各位高手,从setOnCreateContextMenuListener开始往下看就行


package com.example.myktvlist;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class ListActivity extends Activity{
//private String songName;
//private String singerName;

protected static final int COMFIRM = 0;

public void onCreate(Bundle savedInstanceState) {
final int CONFIRM = 1;
System.out.println("step into listActivity");
super.onCreate(savedInstanceState);
setContentView(R.layout.my_list_view);
final ListView list = (ListView)findViewById(R.id.MyListView);
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
DatabaseHelper dbHelper = new DatabaseHelper(ListActivity.this,"songList");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("user", new String[]{"songName","singerName"}, "id=?",new String[]{"1"},null,null, null);
System.out.println("query complete");
cursor.moveToFirst();
if(cursor.isFirst())
System.out.println("moveToFirst complete");
do{
System.out.println("step into while");
String songName = cursor.getString(cursor.getColumnIndex("songName"));
String singerName = cursor.getString(cursor.getColumnIndex("singerName"));
//如果是多项数据怎么办呢?
System.out.println("getData complete");
HashMap<String, String> map = new HashMap<String, String>();
map.put("songName",songName);
map.put("singerName",singerName);
System.out.println("putData complete");
mylist.add(map);
System.out.println("addData complete");
//System.out.println("query--->" + name);
System.out.println(singerName);
}while(cursor.moveToNext());
SimpleAdapter mSchedule = new SimpleAdapter(this, //没什么解释
mylist,//数据来源
R.layout.my_list_item,//ListItem的XML实现
//动态数组与ListItem对应的子项
new String[] {"songName", "singerName"},
//ListItem的XML文件里面的两个TextView ID
new int[] {R.id.songName,R.id.singerName});
//添加并且显示
list.setAdapter(mSchedule);

list.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
public void onCreateContextMenu(ContextMenu menu, View arg1,ContextMenuInfo arg2) {
menu.setHeaderTitle(R.string.contentMenu);
menu.add(0, COMFIRM, 6,R.string.confirm);
menu.add(1,1,5,"hah");
}
});
list.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick(AdapterView<?> ada, View view,
int index, long longIndex) {
list.showContextMenu();
return true;
}
});
list.setOnItemClickListener(new OnItemClickListener(){
//Toast t=Toast.makeText(this, "长按删除该曲目", Toast.LENGTH_LONG);
//t.show();
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
}
});
db.close();
}

//怎么在这个函数知道选择的是哪个条目?
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
// info.targetView得到list.xml中的LinearLayout对象.
System.out.println("item = " + item);
System.out.println("info = " + info);
String songName = ((TextView) info.targetView.findViewById(R.id.songName)) //R.id.confirm
.getText().toString();
System.out.println("songName is");
System.out.println(songName);
if (!TextUtils.isEmpty(songName)) {
if(item.getItemId() == COMFIRM) {
DatabaseHelper dbHelper = new DatabaseHelper(ListActivity.this,"songList");
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
db.delete("user","songName",new String[]{"chen"});
}
}
return false;
}
}



功能是长按listview中的条目,显示“确实删除吗?”的菜单,在点击“确认”之后会删除所选的条目。
但是我用onContextItemSelected这个函数中的item中用AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();得到的info用System.out.print得到的却是null,这导致运行错误,怎么解决呢?
...全文
249 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
AMinfo 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
好像找到错误之处了,是setOnItemLongClickListener要return false,这个函数returne false和true的区别在于啥?
[/Quote]

return false的意思是将长按事件传递给其他视图
return true的意思中止传递。
just4rmb 2012-08-04
  • 打赏
  • 举报
回复
好像找到错误之处了,是setOnItemLongClickListener要return false,这个函数returne false和true的区别在于啥?
just4rmb 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

setOnItemLongClickListener这个才是长按啊
[/Quote]

是啊是啊,这个函数写的对不?不知道为什么,没有取到相应的item
AMinfo 2012-08-04
  • 打赏
  • 举报
回复
setOnItemLongClickListener这个才是长按啊

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧