1、 方法一:在创建子项控件的时候对控件整体进行事件的设置
控件的初始化在ExpandableListView的适配器中,在初始化的时候设置点击事件和长按事件
这里只设置了ChildView的点击事件和长按事件
//设置组里面的项的界面
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View view = View.inflate(MainActivity.this, R.layout.child_view, null);
view.setClickable(true);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(
MainActivity.this,
"子项点击事件",
Toast.LENGTH_SHORT).show();
}
});
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(
MainActivity.this,
"长按中.......",
Toast.LENGTH_SHORT).show();
return true;
}
});
注意:长按事件中的返回值要是true, 不然执行了长按事件之后还会执行点击事件
2、 方法二:使用ExpandableListView设置子项点击事件进行操作
ExpandableListView 设置OnLongClickListener实现onclick方法,在该方法中并不能比较直观的获取到控件的位置信息。注意下面的获取方式:
//设置item点击的监听器
elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
Toast.makeText(
MainActivity.this,
"点击\ngroupPosition=" + groupPosition + ";childPosition=" + childPosition,
Toast.LENGTH_SHORT).show();
return false;
}
});
//设置item长按事件
elv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
int groupId = -1;
int childId = -1;
long packedPosition = elv.getExpandableListPosition(position);
int type = ExpandableListView.getPackedPositionType(packedPosition);
switch (type) {
case 0://表示当前选中项为父条目,即Group
groupId = ExpandableListView.getPackedPositionGroup(packedPosition);
break;
case 1://表示当前选中项为子条目
groupId = ExpandableListView.getPackedPositionGroup(packedPosition);//当前子条目所在的Group
childId = ExpandableListView.getPackedPositionChild(packedPosition);//当前子条目id
break;
default:
break;
}
Toast.makeText(
MainActivity.this,
"长按\nGroupId=" + groupId + ";childId=" + childId,
Toast.LENGTH_SHORT).show();
return true;
}
});
两者的效果是一样的,只是学习阶段,还没有遇到其他问题
效果如下: