您的位置:首页 > 其它

ExpandableListView事件回调

2016-05-11 10:39 567 查看
需求 模拟childView的点击事件 当点击某个组时它的第一个childItem需要被点击

需要模拟点击事件 须知点击事件流程

点击事件流程

基础流程

onTouchUp(触摸弹起事件)——》PerformClick.run ——》performItemClick ——》handleItemClick

groupClickEvent 基础流程——》onGroupClick ——》isExpanded ——》?collapseGroup:expandGroup

注意:当onGroupClick 返回truecollapseGroup或expandGroup将不会被回调 继当里点击了某个group它不会自动展开或关闭该groupf

childClickEvent 基础流程



例如:4个组列表没个组4个子列表 页面加载时

需要显示地一组的第一个 通过performItemClick
(null,0,0)展开地一个列表 通过performItemClick
(null,1,0) 加载第一项

需要显示地三组的第一个 通过performItemClick
(null,3,0)展开地一个列表 通过performItemClick
(null,4,0) 加载第一项

需要显示地三组的第三个 通过performItemClick
(null,3,0)展开地一个列表 通过performItemClick
(null,6,0) 加载第一项

公示 childPosition=groupPosition+显示第几个

显示第三组下第三项 时 加载子列表的应该是performItemClick
(null,6,0) 如果写成performItemClick
(null,8,0)会怎样了?

第三组下只有四项 显示最后一个是performItemClick
(null,7,0) 8大于7 这时将会调用groupClick position为8 由于只有4组 8超出了所有把position修改成3 所以将展开第4组

展开地3组时 执行performItemClick
(null,1,0) 会展开第二组

下面两组代码都是显示地0组地一项

mElvLeftMenus.performItemClick(null,0,0);
mElvLeftMenus.performItemClick(null,1,0);


mElvLeftMenus.expandGroup(0);
mElvLeftMenus.performItemClick(null,1,0);


下面的为折叠第0组

mElvLeftMenus.collapseGroup(0);


group的点击事件 当某个group被点击时被回调

定义

public void setOnGroupClickListener(OnGroupClickListener onGroupClickListener) {
mOnGroupClickListener = onGroupClickListener;
}

/**
* Interface definition for a callback to be invoked when a group in this
* expandable list has been clicked.
*/
public interface OnGroupClickListener {
/**
* Callback method to be invoked when a group in this expandable list has
* been clicked.
*
* @param parent The ExpandableListConnector where the click happened
* @param v The view within the expandable list/ListView that was clicked
* @param groupPosition The group position that was clicked
* @param id The row id of the group that was clicked
* @return True if the click was handled
*/
boolean onGroupClick(ExpandableListView parent, View v, int groupPosition,
long id);
}


实现

ExpandableListView.OnGroupClickListener groupListener=new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

String groupName=String.valueOf(mLeftMenuAdapter.getGroup(groupPosition));
ToastManager.debug(groupName, false);

if(mLeftMenuSlectGroupPosition == groupPosition){
//重复点击
return false;
}

mLeftMenuSlectGroupPosition = groupPosition;

String[] child = mLeftMenuAdapter.getChild(groupPosition);
if (child==null || child.length==0) {

BaseActivity.this.onLeftMenuGroupClick(parent, v, groupPosition, groupName);
return false;
}else {
//             boolean isGroupExpanded=mElvLeftMenus.isGroupExpanded(groupPosition);
//             if(isGroupExpanded){
//                //这里不可能进来 能进这里条件mLeftMenuSlectGroupPosition == groupPosition过不了
//                return false;
//             }

mUiHandler.postDelayed(new Runnable() {
@Override
public void run() {
int childPosition=mLeftMenuSlectGroupPosition+1;
mElvLeftMenus.performItemClick(null,childPosition,mLeftMenuAdapter.getChildId(mLeftMenuSlectGroupPosition,childPosition));
}
},100);
}
return false;
}
};


group展开时的回调事件 当某个group展开时 它被回调

public void setOnGroupExpandListener(OnGroupExpandListener onGroupExpandListener) {
mOnGroupExpandListener = onGroupExpandListener;
}


实现

mElvLeftMenus.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {

@Override
public void onGroupExpand(int groupPosition) {
int groupCount = mLeftMenuAdapter.getGroupCount();
for (int index = 0; index <groupCount; index++) {
if (groupPosition != index) {
mElvLeftMenus.collapseGroup(index);
}
}

}

});

上面的实现效率不咋样可以优化 使用一变量记录上一次展开的groupPosition 当展开列表时判断上次展开列表是否为-1不为-1折叠该组

group折叠回调事件 当某个group折叠时被回调

public void setOnGroupCollapseListener(OnGroupCollapseListener onGroupCollapseListener) {
mOnGroupCollapseListener = onGroupCollapseListener;
}


当设置了onItemSelectedListener 当group或child点击后 onGroupClickListener 或 onChildClickListener都没有得到处理时才会回调它

/**
* Register a callback to be invoked when an item in this AdapterView has
* been selected.
*
* @param listener The callback that will run
*/
public void setOnItemSelectedListener(@Nullable OnItemSelectedListener listener) {
mOnItemSelectedListener = listener;
}


setSelectedGroup 显示到指定组 setSelectedChild 显示到指定组下的某的子项 它们都是调用AbsListView的setSelection方法进行定位

child点击事件 当child被点击时回调



ExpandableListView.OnChildClickListener childListener=new ExpandableListView.OnChildClickListener(){
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
if(v!=null && mLeftMenuSlectGroupPosition ==groupPosition && mLeftMenuSlectChildPosition ==childPosition){
//当v为null时是点击了group 这样的画groupPosition和childPosition有可能相同
ToastManager.debug("点击的为当前页面,不做处理", false);
return true;
}

mLeftMenuSlectGroupPosition =groupPosition;
mLeftMenuSlectChildPosition =childPosition;

String childName=String.valueOf(mLeftMenuAdapter.getChild(groupPosition,childPosition));
ToastManager.debug(childName, false);

BaseActivity.this.onLeftMenuChildClick(parent, v, groupPosition,childPosition, childName);
return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: