? ? ? ?這幾天項(xiàng)目有一個(gè)需求是在點(diǎn)擊ExoandableListview的同時(shí)在點(diǎn)擊的group的右上角彈出popupwindow ? ?但是如果點(diǎn)擊了下邊的項(xiàng) ?就會(huì)自動(dòng)滑動(dòng)顯示下邊使可以顯示下邊的child?就會(huì)出現(xiàn)popupwindow顯示在group之前的位置 ? ? 通過(guò)許多嘗試 ?通過(guò)下邊的方法解決了問(wèn)題
考慮的問(wèn)題
1. ?點(diǎn)擊是否導(dǎo)致滑動(dòng)(通過(guò)發(fā)送延時(shí)的message)?
? ? ? ? ? 先執(zhí)行點(diǎn)擊事件 ?再執(zhí)行滑動(dòng)事件
? ? ? ? ?點(diǎn)擊時(shí)記錄點(diǎn)擊狀態(tài) ? 記錄可以獲取view
?2. 點(diǎn)擊導(dǎo)致的滑動(dòng) ?還是手指拖動(dòng)
? ? ? ? ?查看點(diǎn)擊狀態(tài) ? true為點(diǎn)擊滑動(dòng) false為手指拖動(dòng)
? ? ? ? 如果滑動(dòng)了就不可以獲取 ? ?直到滑動(dòng)停止?
private booleanis GroupExpand = false, readytoPopup=false;
private intclickGroupPosition;
private ExpandableListViewexpandableListView;
expandableListView= (ExpandableListView)view.findViewById(R.id.expandableListView);
//只顯示一個(gè)child
expandableListView.setOnGroupExpandListener(
? ? ? ? ? ? ? ? ? ? ? ? ? ?newExpandableListView.OnGroupExpandListener() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@Override
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?public voidonGroupExpand(intarg0) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?for(inti =0;i
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(arg0 != i) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?expandableListView.collapseGroup(i);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? }
});
//監(jiān)聽(tīng)點(diǎn)擊事件? isGroupExpand為true? readytoPopup=true;?
expandableListView.setOnGroupClickListener(
? ? ? newExpandableListView.OnGroupClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public booleanonGroupClick(ExpandableListView parent,View v, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? intgroupPosition, longid) {
? ? ? ? ? ? ? ? ? ? ?//是否被點(diǎn)擊
? ? ? ? ? ? ? ? ? ? ? isGroupExpand=true;
? ? ? ? ? ? ? ? ? ? ? clickGroupPosition= groupPosition;
? ? ? ? ? ? ? ? ? ? ? //是否可以得到view
? ? ? ? ? ? ? ? ? ? ?readytoPopup=true;
? ? ? ? ? ? ? ? ? ? ? ?//延時(shí)發(fā)送 ? 判斷是否點(diǎn)擊了下邊的group導(dǎo)致自動(dòng)向上滑動(dòng) ?沒(méi)滑動(dòng)直接獲取 ??
? ? ? ? ? ? ? ? ? ? ? ? //? ? 滑動(dòng)的話? 設(shè)置readytoPopup=false ?
? ? ? ? ? ? ? ? ? ? ? handler.sendMessageDelayed(handler.obtainMessage(0,v),200);
? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ?}
});
expandableListView.setOnScrollListener(newAbsListView.OnScrollListener() {
? ? ? @Override
? ? ? public voidonScrollStateChanged(AbsListView view, intscrollState) {
? ? ? ? ? ? ?//點(diǎn)擊下邊的group導(dǎo)致滑動(dòng) ?
? ? ? ? ? ?if(isGroupExpand) {
? ? ? ? ? ? ? ? ?//點(diǎn)擊后判斷是否滑動(dòng)停止? 停止的話 可以獲取 否則不可以再發(fā)送
? ? ? ? ? ? ? ? ? //SCROLL_STATE_IDLE ? 表示滑動(dòng)停止 ?
? ? ? ? ? ? ? ? ?if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //滑動(dòng)停止 ?可以獲取
? ? ? ? ? ? ? ? ? ? ? ? ? ? readytoPopup=true;
? ? ? ? ? ? ? ? ? ? ? ? ? ? handler.sendMessageDelayed(handler.obtainMessage(0,view),0);
? ? ? ? ? ? ? ? ?}else{
? ? ? ? ? ? ? ? ? ? ? //滑動(dòng)沒(méi)有停止 ?不可以獲取
? ? ? ? ? ? ? ? ? ? ?readytoPopup=false;
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? //沒(méi)點(diǎn)擊? 只滑動(dòng) ? 關(guān)閉打開(kāi)的child
? ? ? ? ? ? ? ? ? ? ? expandableListView.collapseGroup(clickGroupPosition);
? ? ? ? ? ? ?}
}
@Override
public voidonScroll(AbsListView view, intfirstVisibleItem, intvisibleItemCount, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?inttotalItemCount) {
? ? ? ? ? ? ? ? ? }
});
privateHandlerhandler=newHandler() {
? ? ? ? ? ? public voidhandleMessage(android.os.Message msg) {
? ? ? ? ? ? ? ? ? ? switch(msg.what) {
? ? ? ? ? ? ? ? ? ? ? ? //判斷是否可以打開(kāi)
? ? ? ? ? ? ? ? ? ? ? ?case ? 0:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(readytoPopup) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(popupWindow!=null) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? itemView ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?=getViewByPosition(clickGroupPosition,expandableListView);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? readytoPopup=false;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? isGroupExpand=false;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ?default:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? }
? ? ? }
};
/**
* 通過(guò)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);
? ? ? ? ? ? }
}