ExpandableListView事件回调

需求  模拟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;
   }
};


 

猜你喜欢

转载自blog.csdn.net/nailsoul/article/details/51372319
今日推荐