1

私と同じ問題に遭遇した人のために、ここに残します:

を設定しようとしていてOnItemLongClickListenerExpandableListViewクリックされたグループを知りたいと思っていました。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;
}

私が見つけたのは、位置と id が常に同じ (正しい) 値を持っていることです。ただし、型は常にグループとして認識され、展開された位置は常に 0 でした。

では、そのコードの何が問題なのですか?

4

2 に答える 2

7

投稿されたコードの問題は、それpositionがパックされた位置ではなく、クリックされたアイテムのフラットな位置であることです。つまり、グループ アイテムと表示されている子アイテムがカウントされます。

解決策は、フラットな位置からパックされた位置を取得し、それをアンパックすることです。

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

groupPositionクリックしたグループの正しい位置を保持するようになりました。

于 2013-07-15T16:34:09.277 に答える