检测哪个选定项(在列表视图中)生成了ContextMenu(Android)
我有一个菜单,允许用户长按一个项目,以获得上下文菜单。我遇到的问题是确定他们长按了哪个检测哪个选定项(在列表视图中)生成了ContextMenu(Android),android,listview,contextmenu,Android,Listview,Contextmenu,我有一个菜单,允许用户长按一个项目,以获得上下文菜单。我遇到的问题是确定他们长按了哪个ListItem。我试过这样做: myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, final View v, ContextMenuInfo menuInfo) { menu.
ListItem
。我试过这样做:
myListView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override public void onCreateContextMenu(ContextMenu menu, final View v, ContextMenuInfo menuInfo) {
menu.add("Make Toast")
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem item) {
String toastText = "You clicked position " + ((ListView)v).getSelectedItemPosition();
Toast.makeText(DisplayScheduleActivity.this, toastText, Toast.LENGTH_SHORT).show();
return true;
}
});
}
});
但它只是挂起,直到弹出一个窗口。我怀疑创建菜单后,列表项
不再被选中
看起来您可以监视单击或长时间单击,然后在此处记录单击的项目:
mArrivalsList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
// record position/id/whatever here
return false;
}
});
mArrivalsList.setOnItemLongClickListener(新的OnItemLongClickListener(){
@重写公共布尔值长单击(AdapterView父对象、视图v、整型位置、长id){
//在此处记录位置/id/任何内容
返回false;
}
});
但这让我觉得很尴尬。有人对此有更好的解决方案吗?视图参数不是实际选定行的视图,还是我遗漏了这个问题
ListView lv;
private OnItemLongClickListener onLongClick = new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
lv.showContextMenuForChild(arg1);
lv.showContextMenu();
return false;
}
};
ListView-lv;
私有OnItemLongClickListener onLongClick=新建OnItemLongClickListener(){
长单击(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
lv.showContextMenuForChild(arg1);
lv.showContextMenu();
返回false;
}
};
我们成功地使用了:
@Override
public boolean onContextItemSelected
(
MenuItem item
)
{
if (!AdapterView.AdapterContextMenuInfo.class.isInstance (item.getMenuInfo ()))
return false;
AdapterView.AdapterContextMenuInfo cmi =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo ();
Object o = getListView ().getItemAtPosition (cmi.position);
return true;
}
我就是这么做的。在我的
onCreateContextMenu(…)
方法中,我将ContextMenu.ContextMenuInfo
转换为AdapterView.AdapterContextMenuInfo
。从那里,您可以获得targetView,并将其再次转换到小部件。完整的代码在中提供,请查找onCreateContextMenu(…)
方法
@Override
public void onCreateContextMenu(ContextMenu contextMenu,
View v,
ContextMenu.ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) menuInfo;
selectedWord = ((TextView) info.targetView).getText().toString();
selectedWordId = info.id;
contextMenu.setHeaderTitle(selectedWord);
contextMenu.add(0, CONTEXT_MENU_EDIT_ITEM, 0, R.string.edit);
contextMenu.add(0, CONTEXT_MENU_DELETE_ITEM, 1, R.string.delete);
}
请注意,我将所选文本和所选id存储在私有字段中。由于UI是线程限制的,我知道selectedWord和selectedWordId字段对于以后的操作是正确的。首先,我想知道使用
查看.setOnCreateContextMenuListener()
是否让事情变得有点过于复杂。如果您使用Activity.registerForContextMenu()
,事情会变得容易得多,因为这样您就可以使用Activity.onCreateContextMenu()
和Activity.onContextItemSelected()
来处理所有菜单事件。它基本上意味着您不必定义所有这些匿名内部类来处理每个事件;您只需要重写一些活动方法来处理这些上下文菜单事件
其次,检索当前所选项目肯定有更简单的方法。您所需要做的就是保留对列表视图
或用于填充它的适配器
的引用。您可以使用ContextMenuInfo作为AdapterContextMenuInfo来获取项目的位置;然后,您可以使用ListView.getItemAtPosition()
或Adapter.getItem()
检索专门链接到所单击内容的对象。例如,假设我正在使用Activity.onCreateContextMenu()
,我可以这样做:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// Get the info on which item was selected
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
// Get the Adapter behind your ListView (this assumes you're using
// a ListActivity; if you're not, you'll have to store the Adapter yourself
// in some way that can be accessed here.)
Adapter adapter = getListAdapter();
// Retrieve the item that was clicked on
Object item = adapter.getItem(info.position);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// Here's how you can get the correct item in onContextItemSelected()
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Object item = getListAdapter().getItem(info.position);
}
别忘了把这个
registerForContextMenu(listview);
在onCreate
方法中,使上下文菜单可见。这是关于如何创建上下文菜单的另一种方法n如何删除此处选择的项目是完整的代码
public class SimpleJokeList extends Activity {
public static final int Upload = Menu.FIRST + 1;
public static final int Delete = Menu.FIRST + 2;
int position;
ListView lv;
EditText jokeBox;
Button addJoke;
MyAdapter adapter;
private ArrayAdapter<String> mAdapter;
private ArrayList<String> mStrings = new ArrayList<String>();
String jokesToBeAdded;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simplejokeui);
lv=(ListView)findViewById(R.id.jokelist);
addJoke=(Button)findViewById(R.id.addjoke);
jokeBox=(EditText)findViewById(R.id.jokebox);
mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings);
registerForContextMenu(lv);
listItemClicked();
addJokes();
private void addJokes() {
// TODO Auto-generated method stub
addJoke.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
jokesToBeAdded=jokeBox.getText().toString();
if(jokesToBeAdded.equals("")){
Toast.makeText(getApplicationContext(), "please enter some joke", Toast.LENGTH_LONG).show();
}
else{
lv.setAdapter(mAdapter);
mAdapter.add(jokesToBeAdded);
jokeBox.setText(null);
}
}
});
}
private void listItemClicked() {
// TODO Auto-generated method stub
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
position=arg2;
return false;
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
populateMenu(menu);
menu.setHeaderTitle("Select what you wanna do");
}
private void populateMenu(ContextMenu menu) {
// TODO Auto-generated method stub
menu.add(Menu.NONE, Upload, Menu.NONE, "UPLOAD");
menu.add(Menu.NONE, Delete, Menu.NONE, "DELETE");
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
return (applyMenuChoice(item) || super.onContextItemSelected(item));
}
private boolean applyMenuChoice(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId())
{
case Delete:
String s=mAdapter.getItem(position);
mAdapter.remove(s);
// position--;
Toast.makeText(getApplicationContext(),"Congrats u HAve Deleted IT", Toast.LENGTH_LONG).show();
return (true);
}
return false;
}
公共类SimpleJokeList扩展活动{
公共静态最终整数上传=Menu.FIRST+1;
公共静态最终整数删除=Menu.FIRST+2;
内部位置;
ListView lv;
EditText-jokeBox;
按钮添加笑话;
MyAdapter适配器;
私人ArrayaAdapter mAdapter;
private ArrayList mStrings=new ArrayList();
串珠;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.simplejokeui);
lv=(ListView)findViewById(R.id.jokelist);
addJoke=(按钮)findViewById(R.id.addJoke);
jokeBox=(EditText)findViewById(R.id.jokeBox);
mAdapter=newarrayadapter(这个,android.R.layout.simple\u list\u item\u 1,mStrings);
registerForContextMenu(lv);
listItemClicked();
添加笑话();
私人文件{
//TODO自动生成的方法存根
addJoke.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
jokesToBeAdded=jokeBox.getText().toString();
if(添加了笑料的等于(“”){
Toast.makeText(getApplicationContext(),“请输入一些笑话”,Toast.LENGTH\u LONG.show();
}
否则{
低压设置适配器(mAdapter);
mAdapter.add(添加笑料);
jokeBox.setText(空);
}
}
});
}
私有void listItemClicked(){
//TODO自动生成的方法存根
lv.setOnItemLongClickListener(新的OnItemLongClickListener(){
@凌驾
长单击(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
//TODO自动生成的方法存根
位置=arg2;
返回false;
}
});
}
@凌驾
public void onCreateContextMenu(ContextMenu,视图v,
上下文菜单信息(menuInfo){
//TODO自动生成的方法存根
super.onCreateContextMenu(menu,v,menuInfo);
大众菜单(菜单);
menu.setHeaderTitle(“选择你想做的事”);
}
私有void populateMenu(上下文菜单){
//TODO自动生成的方法存根
menu.add(menu.NONE,Upload,menu.NONE,“Upload”);
menu.add(menu.NONE,Delete,menu.NONE,“Delete”);
}
@凌驾
公共布尔值onContextItemSelected(MenuItem项)
{
return(applyMenuChoice(item)| | super.onContextItemSelected(item));
}
私有布尔applyMenuChoice(菜单项){
//TODO自动生成的方法存根
开关(item.getItemId())
{
案例删除:
字符串s=mAdapter.getItem(位置);
移动(s);
//位置--;
Toast.makeText(getAppli
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
View TargetV=(View) info.targetView;
text1 = (String) ((TextView) TargetV.findViewById(R.id.textView1)).getText();
text2 = (String) ((TextView) TargetV.findViewById(R.id.textView2)).getText();
if(List3Ok){
text3 = (String) ((TextView) TargetV.findViewById(R.id.textView3)).getText();
}
selectedWord = text1 + "\n" + text2 + "\n" + text3;
selectedWordId = info.id;
menu.setHeaderTitle(selectedWord);
MenuInflater inflater = this.getActivity().getMenuInflater();
inflater.inflate(R.menu.list_menu, menu);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
getActivity().getMenuInflater().inflate(R.menu.project_list_item_context, menu);
// Getting long-pressed item position
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
int position = info.position;
// Get all records from adapter
Cursor c = ((SimpleCursorAdapter)getListAdapter()).getCursor();
// Go to required position
c.moveToPosition(position);
// Read database fields values associated with our long-pressed item
Log.d(TAG, "Long-pressed-item with position: " + c.getPosition());
Log.d(TAG, "Long-pressed-item _id: " + c.getString(0));
Log.d(TAG, "Long-pressed-item Name: " + c.getString(1));
Log.d(TAG, "Long-pressed-item Date: " + c.getString(2));
Log.d(TAG, "Long-pressed-item Path: " + c.getString(3));
// Do whatever you need here with received values
}