java - 我如何确定谁触发了 onContextItemSelected?

标签 java android expandablelistview

我使用的是 ExpandableListView,他们在此示例代码中的使用方式相同: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html

ExpandableListView 会填充类别及其子类别(单击类别后)。例子: -乳制品(类) -牛奶(子类别) -奶酪(子类)

当我长按牛奶或奶酪时,使用此功能会弹出一个菜单:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    ExpandableListContextMenuInfo info =(ExpandableListContextMenuInfo) menuInfo;
    String selectedWord = ((TextView) info.targetView).getText().toString();
    menu.setHeaderTitle(selectedWord.split(",")[1]);   //set header
    String itemId = selectedWord.split(",")[0];
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
    nameValuePairs.add(new BasicNameValuePair("action", "getProducts"));
    nameValuePairs.add(new BasicNameValuePair("subcat_id", itemId));
    String response = helper.makeHttpRequest(nameValuePairs);
    String[] items = response.split(";");

    for (int i=0; i<items.length; i++){
        menu.add(0, 0, 0, items[i]);
    }
}

然后,当我单击弹出菜单中的一项时,我想知道列表中的哪一项被选中(如果我单击“牛奶”。例如,菜单中有“1% 牛奶”、“2%牛奶”等_ 这个函数被触发:

    @Override
public boolean onContextItemSelected(MenuItem item) {
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();
    String title = ((TextView) info.targetView).getText().toString();
    String selected="";
    int type = ExpandableListView.getPackedPositionType(info.packedPosition);
    if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 
        Toast.makeText(this, title + " selected: " + selected+ " " + childPos + " clicked in group " + groupPos , Toast.LENGTH_SHORT).show();
        return true;
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
        Toast.makeText(this, title  + " selected: " + selected + " " + childPos + " clicked in group " + groupPos , Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

但我没有找到一种方法来确定单击了列表中的确切项目。

有什么想法吗? 先感谢您!如果我需要更清楚,请告诉我。

最佳答案

您添加到 ContextMenu 的每个项目都应该有自己的唯一标识符。当您需要确定选择了哪个菜单项时,这很有用。所以添加菜单项需要像这样:menu.add(0, unique_id, 0, items_name);。然后,当您想确定选择了哪个项目时,您可以使用项目 ID 在 onContextItemSelected 中执行类似的操作:

switch (item.getItemId()){
    case UNIQUE_ID_1:
        //handle what to do
    break;
    case UNIQUE_ID_2:
        //handle what to do
    break;
    ....

因此您可能需要稍微更改您的实现。我会为每种可能的情况创建一个唯一的 id 作为 int 常量,并将每个具体添加到菜单中。代码可能会多一些,但处理起来会容易得多。

这只是一个建议,因为您是新来的:当有人提供了一个好的答案时,您应该通过单击答案旁边的复选标记来接受它。祝你好运!

关于java - 我如何确定谁触发了 onContextItemSelected?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474945/

相关文章:

java - 迭代深化A*星解释

java - 为什么我在尝试创建 JDOM 文档时得到 DefferedDocumentImpl?

Java 表呈现

android - 为什么android/gradle会引发: "No resource identifier found for attribute ' compileSdkVersion'"?

android - 每行有多个 child 的 ExpandableListView

Android - 在 ScrollView 中使用 ExpandableListView 的relativelayout

java - 用于最小成本流问题的开源 Java 库

android - 如何在包含特殊符号的字符串资源中保存条目

android - 我想在没有用户交互的情况下自动打印

ios - 当 isVisible 设置为 true 时, ListView 未更新