如何在ExpandableListView中选择子项?

时间:2015-02-04 17:49:30

标签: android listview expandablelistview

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

我仍有这个问题:

How to access items inside ExpandableListView?

让我恢复。我的应用程序中有这种情况:

enter image description here

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

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

知道

private ExpandableListView mGattServicesList;

是否有一种非常简单的方法可以对组内的项目执行Click()?

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

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

但我不想单独点击该项目,我也找不到在该组中选择此特定项目的方法。

提前谢谢

2 个答案:

答案 0 :(得分:8)

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

mGattServicesList.expandGroup(groupPosition);

以编程方式单击某个项目有点棘手。您使用performItemClick()方法进入了正确的轨道,但您对如何使用它有一点了解。我假设你没有使用标题。这进一步使事情复杂化。

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

//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检查此代码,因此可能存在一些语法错误,这些错误会阻止编译。但总而言之,应该以编程方式单击子视图来传达不那么容易的步骤。

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

答案 1 :(得分:0)

您无法为列表中的特定项目设置侦听器,但您可以执行所需的操作。只需检查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
}