ExpandableListView.getPackedPositionGroup всегда возвращает 0 в onItemLongClick

Для тех, кто столкнулся с той же проблемой, что и я, я оставлю это здесь:

Я пытался настроить OnItemLongClickListener для ExpandableListView и хотел знать, какая группа была нажата. Следуя советам многих вопросов здесь, на SO (например, этот вопрос), я использовал ExpandableListView.getPackedPositionGroup, однако всегда возвращал 0.

Вот код, который я использовал:

@Override
public boolean onItemLongClick(AdapterView<?> list, View view, int position, long id) {
    Log.d(D, "position: "+position);
    Log.d(D, "id: "+position);
    Log.d(D, "unpacked position: "+ExpandableListView.getPackedPositionGroup(position));

    switch(ExpandableListView.getPackedPositionType(position)) {
        case ExpandableListView.PACKED_POSITION_TYPE_CHILD:
            Log.d(D, "position type: child");
            break;

        case ExpandableListView.PACKED_POSITION_TYPE_GROUP:
            Log.d(D, "position type: group");
            break;

        case ExpandableListView.PACKED_POSITION_TYPE_NULL:
            Log.d(D, "position type: null");
            break;

        default:
            Log.wtf(D, "position type: "+ExpandableListView.getPackedPositionType(position));
    }
    return true;
}

Я обнаружил, что позиция и идентификатор всегда имели одинаковое (правильное) значение. Однако тип всегда распознавался как группа, а неупакованная позиция всегда была 0.

Так что же не так с этим кодом?


person IchBinKeinBaum    schedule 15.07.2013    source источник


Ответы (1)


Проблема с размещенным кодом заключается в том, что position - это не упакованная позиция, а плоская позиция выбранного элемента. Это означает, что учитываются групповые элементы, а также видимые дочерние элементы.

Решение состоит в том, чтобы получить упакованную позицию из плоской, а затем распаковать ее:

final int packedPosition = ((ExpandableListView) list).getExpandableListPosition(position);
final int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition);

groupPosition теперь занимает правильное положение группы, по которой щелкнули.

person IchBinKeinBaum    schedule 15.07.2013