Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测哪个选定项(在列表视图中)生成了ContextMenu(Android)_Android_Listview_Contextmenu - Fatal编程技术网

检测哪个选定项(在列表视图中)生成了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

}