1

对于那些遇到与我相同的问题的人,我将把它留在这里:

我试图为一个设置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;
}

我发现 position 和 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 回答
0

采用 :

int groupPosition = ExpandableListView.getPackedPositionGroup(id);

代替

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

实际上 longClickListener 函数中的第 4 项只是打包的位置。Android studio 生成时,将其命名为 id

public boolean onItemLongClick
(AdapterView<?> list, View view, int position, long id -> this is packedPosition)
于 2021-12-07T06:49:01.007 回答