如何在 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 该组中该特定项目的方法。
提前致谢
您不能为列表中的特定项目设置侦听器,但您可以为所欲为。只需检查 groupPosition
和 childPosition
是否是您想要的,然后执行操作(或适合其他项目的其他操作)
在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.
我已经问过这个问题,但没有成功。所以我再问一次(抱歉顺便说一句)。
我还有这个问题:
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 该组中该特定项目的方法。
提前致谢
您不能为列表中的特定项目设置侦听器,但您可以为所欲为。只需检查 groupPosition
和 childPosition
是否是您想要的,然后执行操作(或适合其他项目的其他操作)
在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.