这几天项目有一个需求是在点击ExoandableListview的同时在点击的group的右上角弹出popupwindow 但是如果点击了下边的项 就会自动滑动显示下边使可以显示下边的child 就会出现popupwindow显示在group之前的位置 通过许多尝试 通过下边的方法解决了问题
考虑的问题
1. 点击是否导致滑动(通过发送延时的message)
先执行点击事件 再执行滑动事件
点击时记录点击状态 记录可以获取view
2. 点击导致的滑动 还是手指拖动
查看点击状态 true为点击滑动 false为手指拖动
如果滑动了就不可以获取 直到滑动停止
private booleanis GroupExpand = false, readytoPopup=false;
private intclickGroupPosition;
private ExpandableListViewexpandableListView;
expandableListView= (ExpandableListView)view.findViewById(R.id.expandableListView);
//只显示一个child
expandableListView.setOnGroupExpandListener(
newExpandableListView.OnGroupExpandListener() {
@Override
public voidonGroupExpand(intarg0) {
for(inti =0;i
if(arg0 != i) {
expandableListView.collapseGroup(i);
}
}
}
});
//监听点击事件 isGroupExpand为true readytoPopup=true;
expandableListView.setOnGroupClickListener(
newExpandableListView.OnGroupClickListener() {
@Override
public booleanonGroupClick(ExpandableListView parent,View v, intgroupPosition, longid) {
//是否被点击
isGroupExpand=true;
clickGroupPosition= groupPosition;
//是否可以得到view
readytoPopup=true;
//延时发送 判断是否点击了下边的group导致自动向上滑动 没滑动直接获取
// 滑动的话 设置readytoPopup=false
handler.sendMessageDelayed(handler.obtainMessage(0,v),200);
return false;
}
});
expandableListView.setOnScrollListener(newAbsListView.OnScrollListener() {
@Override
public voidonScrollStateChanged(AbsListView view, intscrollState) {
//点击下边的group导致滑动
if(isGroupExpand) {
//点击后判断是否滑动停止 停止的话 可以获取 否则不可以再发送
//SCROLL_STATE_IDLE 表示滑动停止
if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
//滑动停止 可以获取
readytoPopup=true;
handler.sendMessageDelayed(handler.obtainMessage(0,view),0);
}else{
//滑动没有停止 不可以获取
readytoPopup=false;
}
}else{
//没点击 只滑动 关闭打开的child
expandableListView.collapseGroup(clickGroupPosition);
}
}
@Override
public voidonScroll(AbsListView view, intfirstVisibleItem, intvisibleItemCount, inttotalItemCount) {
}
});
privateHandlerhandler=newHandler() {
public voidhandleMessage(android.os.Message msg) {
switch(msg.what) {
//判断是否可以打开
case 0:
if(readytoPopup) {
if(popupWindow!=null) {
itemView =getViewByPosition(clickGroupPosition,expandableListView);
readytoPopup=false;
isGroupExpand=false;
}
break;
default:
break;
}
}
};
/**
* 通过pos的到item的view
*@param pos
*@param listView
*@return
*/
publicViewgetViewByPosition(int pos,ExpandableListView listView) {
final intfirstListItemPosition = listView.getFirstVisiblePosition();
final intlastListItemPosition = firstListItemPosition + listView.getChildCount() -1;
if(pos < firstListItemPosition || pos > lastListItemPosition) {
returnlistView.getAdapter().getView(pos, null,listView);
}else{
final intchildIndex = pos - firstListItemPosition;
returnlistView.getChildAt(childIndex);
}
}