Android ContextMenu auf Sub-Items in ExpandableListView

kurztipp

Aktives Mitglied
Hallo,

ich versuche ein ContextMenu für ein ExpandableListView zu implementieren. Es wird aber nur für die Group-Items und nicht für die Child-Items aufgerufen.
Scheinbar ruft ein longClick auf Child-Items onCreateContextMenu nicht auf, da nicht einmal die Logausgabe bei einem longClick auf ein Child-Item ausgegeben wird.

Java:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...
        setListAdapter(mAdapter);
        registerForContextMenu(getExpandableListView());
    }

Java:
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        Log.i("", "Click");
        ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;

        int type = ExpandableListView.getPackedPositionType(info.packedPosition);
        int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);

        // Show context menu for groups
        if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
            menu.setHeaderTitle("Group");
            menu.add(0, 0, 1, "Delete");

            // Show context menu for children
        } else if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
            menu.setHeaderTitle("Child");
            menu.add(0, 0, 1, "Delete");
        }
    }



Java:
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item
                .getMenuInfo();

        int type = ExpandableListView.getPackedPositionType(info.packedPosition);
        int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);

        if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
            // do something with parent

        } else if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
            // do someting with child
        }

        return super.onContextItemSelected(item);
    }

Ich frage mich, ob man die Child-Items separat registrieren muss, ich finde dazu aber nichts in der Doku.

Gruß
 

dzim

Top Contributor
Ich würde es tatsächlich einmal so, wie du es überlegst, probieren. Ich finde den ExpandableListView von Android als entweder ziemlich kompliziert oder einfach nur schlecht implementiert... Ich habe mit dem auch schon viel Spaß gehabt, nur ContextMenus habe ich bisher noch nicht benötigt.
 

kurztipp

Aktives Mitglied
Hallo,

mit
Code:
registerForContextMenu()
in
Code:
newChildView()
würde es zwar funktionieren, aber dann wird
Code:
onCreateContextMenu()
zwei Mal aufgerufen und
Code:
ContextMenuInfo menuInfo
ist dann
Code:
null
.
Die Lösung ist viel einfacher:
Java:
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

Eclipse hat diese abstrakte Methode aber netterweise automatisch mit
Code:
return false;
implementiert, weshalb klar ist, dass kein Kontextmenü angezeigt wird.

Gruß
 

Neue Themen


Oben