如何在 ExpandableListView 中 select child?

How to select child in ExpandableListView?

我已经问过这个问题,但没有成功。所以我再问一次(抱歉顺便说一句)。

我还有这个问题:

How to access items inside ExpandableListView?

让我继续。我的应用程序中有这种情况:

我想在第 2 组的第 2dn 项上执行 performClick()。 我现在所能做的就是使用这行代码用 performClick() 扩展第二组:

 mGattServicesList.performItemClick(mGattServicesList.getChildAt(1), 1, mGattServicesList.getItemIdAtPosition(1));

知道

private ExpandableListView mGattServicesList;

没有一个非常简单的方法可以对组内的项目执行 performClick() 吗?

我想这样做是因为我有一个像

这样的监听器
private final ExpandableListView.OnChildClickListener servicesListClickListner =
        new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
                                        int childPosition, long id) {

但我不想自己点击该项目,而且我找不到 select 该组中该特定项目的方法。

提前致谢

您不能为列表中的特定项目设置侦听器,但您可以为所欲为。只需检查 groupPositionchildPosition 是否是您想要的,然后执行操作(或适合其他项目的其他操作)

ExpandableListView.OnChildClickListener

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
    //groupPosition tells you what group the clicked child came from
    //childPosition tells you what child was clicked
    if (groupPosition == 2 && childPosition == 2) {
        //so this code only executes if the 2nd child in the 2nd group is clicked 
    }
    //you can ignore the other items or do something else when they are clicked
}

首先,ExpandableListView 支持一种简单的方法来扩展您需要的组:

mGattServicesList.expandGroup(groupPosition);

以编程方式单击项目有点棘手。您在使用 performItemClick() 方法方面走在正确的轨道上,但您对如何使用它有点偏离。我假设您没有使用 headers。这使事情更加复杂。

首先需要获取要点击的View。奇怪的是,这不是必需的。您可以使用空视图安全地调用 performItemClick()。唯一的缺点是您的 child 点击侦听器也会收到空视图。

//First we need to pack the child's two position identifiers
long packedPos = ExpandableListView.getPackedPositionForChild(int groupPosition, int childPosition);

//Then we convert to a flat position to use with certain ListView methods
int flatPos = mGattServicesList.getFlatListPosition(packedPos);

//Now adjust the position based on how far the user has scrolled the list.
int adjustedPos = flatPos - mGattServicesList.getFirstVisiblePosition();

//If all is well, the adjustedPos should never be < 0
View childToClick = mGattServicesList.getChildAt(adjustedPos);

现在我们需要将位置和 ID 提供给 performItemclick()。您会看到这些步骤类似于检索视图。所以真的,你不必再进一步输入......但要显示你需要什么:

//You can just reuse the same variables used above to find the View
long packedPos = ExpandableListView.getPackedPositionForChild(int groupPosition, int childPosition);
int flatPos = mGattServicesList.getFlatListPosition(packedPos);

//Getting the ID for our child
long id = mGattServicesList.getExpandableListAdapter().getChildId(groupPosition, childPosition);

最后,您可以调用您的 performItemClick():

performItemClick(childToClick, flatPos, id);

我应该作为序言,我没有根据 IDE 检查此代码,因此可能存在一些语法错误,会阻止编译。但总而言之,不幸的是,以编程方式单击 child 视图并不是那么简单的步骤。

最后请注意,您提供的图片显示了组和 child 计数从 1 开始。请注意,它们实际上被视为基于零的位置。所以第一组在位置 0,每个组的第一个 child 在位置 0.