首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检测哪个选定的项目(在ListView中)生成了ContextMenu (安卓)

检测哪个选定的项目(在ListView中)生成了ContextMenu (安卓)
EN

Stack Overflow用户
提问于 2010-02-24 04:08:12
回答 8查看 66K关注 0票数 58

我有一个ListView,它将允许用户长按一个项目,以获得上下文菜单。我遇到的问题是无法确定他们长时间按下了哪个ListItem。我试过这样做:

代码语言:javascript
复制
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;
     }
    });
  } 
 });

但它会一直挂起,直到弹出一个ANR。我怀疑在菜单创建之后,ListItem不再被选中。

看起来你可以监控点击或长点击,然后记录点击的项目:

代码语言:javascript
复制
 mArrivalsList.setOnItemLongClickListener(new OnItemLongClickListener() {
  @Override public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
   // record position/id/whatever here
   return false;
  }
 });

但对我来说,这主要是乱七八糟的。有人对此有更好的解决方案吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-02-24 04:20:40

我就是这么做的。在我的onCreateContextMenu(...)方法中,我将ContextMenu.ContextMenuInfo转换为AdapterView.AdapterContextMenuInfo。从那里,您可以获得targetView,您可以将其再次转换为小部件。完整的代码可以在HomeActivity.java中找到,请查找onCreateContextMenu(...)方法。

代码语言:javascript
复制
@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);
}

请注意,我将所选文本以及select id存储在私有字段中。因为UI是线程受限的,所以我知道selectedWord和selectedWordId字段对于以后的操作是正确的。

票数 77
EN

Stack Overflow用户

发布于 2010-02-24 05:50:25

首先,我想知道使用View.setOnCreateContextMenuListener()会不会让事情变得过于复杂。如果使用Activity.registerForContextMenu(),事情会变得容易得多,因为这样就可以只使用Activity.onCreateContextMenu()Activity.onContextItemSelected()来处理所有的菜单事件。这基本上意味着您不必定义所有这些匿名内部类来处理每个事件;您只需覆盖一些活动方法来处理这些上下文菜单事件。

其次,绝对有更简单的方法来检索当前选定的项。您所需要做的就是保持对ListView或用于填充它的Adapter的引用。您可以使用ContextMenuInfo作为AdapterContextMenuInfo来获取项目的位置;然后可以使用ListView.getItemAtPosition()Adapter.getItem()来检索明确链接到所单击内容的Object。例如,假设我使用的是Activity.onCreateContextMenu(),我可以这样做:

代码语言:javascript
复制
@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);
}
票数 67
EN

Stack Overflow用户

发布于 2011-08-10 14:05:21

这是关于如何创建上下文菜单的另一种方法n如何删除此处选择的项目是整个代码

代码语言:javascript
复制
     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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2321332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档