ExpandableListView 改变属性


今天要实现的 ExpandableListView 和原生的的不太一样,

需要第一 显示的时候,

  groupView 和childView 都要显示

第二: 点击groupView 原生的方法效果是,显示和隐藏 childVIew  ,而我要实现的效果是,groupVIew 点击跳转到一个界面 childView 点击跳转到一个界面;

第三:groupView 下边有的有childVIew 有的没有childView ;  有的就直接全部显示出来,没有的下边直接什么都不显示;



先来看一下 ExpandableListView 设置adapter 实例代码



private class Myadapter extends BaseExpandableListAdapter{

		public int getGroupCount() {
			groupNames = CommonNumDao.getGroupInfos();
			//System.out.println.println(groupNames.size()+"group");
			return groupNames.size();
		}
		
		/**
		 * 得到某个分组里所有孩子的个数,
		 * 并判断内存中有没有,如果没有,放入内存中map集合里面
		 */
		public int getChildrenCount(int groupPosition) {
			List<String> childrenInfos;
			//如果内存中已经有了的话直接取内存里面的数据,如果没有查数据库,并把查出来的数据存到内存中
			if(childrenCacheInfos.containsKey(groupPosition)){
				childrenInfos = childrenCacheInfos.get(groupPosition);
			}else{
				childrenInfos = CommonNumDao.getChildInfosByPosition(groupPosition);
				childrenCacheInfos.put(groupPosition, childrenInfos);
			}
			//System.out.println.println(childrenInfos.size());
			return childrenInfos.size();
		}
		//获取分组的信息集合
		public Object getGroup(int groupPosition) {
			return null;
		}
		
		
		//
		public Object getChild(int groupPosition, int childPosition) {
			// TODO Auto-generated method stub
			return null;
		}

		public long getGroupId(int groupPosition) {
			return 0;
		}

		public long getChildId(int groupPosition, int childPosition) {
			return 0;
		}

		public boolean hasStableIds() {
			return false;
		}
		//获取到分组的view视图
		public View getGroupView(int groupPosition, boolean isExpanded,
				View convertView, ViewGroup parent) {
			TextView tv;
			if(convertView!=null&&convertView instanceof TextView){
				tv = (TextView) convertView;
			}else{
				tv = new TextView(getApplicationContext());
			}
			
			tv.setTextSize(30);
			tv.setTextColor(Color.BLACK);
			
			tv.setText("		"+groupNames.get(groupPosition));
			return tv;
		}
		//获取到某个分组内的每个item的view
		public View getChildView(int groupPosition, int childPosition,
				boolean isLastChild, View convertView, ViewGroup parent) {
			
			TextView tv;
			if(convertView!=null&&convertView instanceof TextView){
				tv = (TextView) convertView;
			}else{
				tv = new TextView(getApplicationContext());
			}
			tv.setTextSize(20);
			tv.setTextColor(Color.BLACK);
			
			tv.setText("  "+childrenCacheInfos.get(groupPosition).get(childPosition));
			
			return tv;
		}
		
		//分组里面的子条目是否可以被点击,默认是false,复写这个方法,返回true
		public boolean isChildSelectable(int groupPosition, int childPosition) {
			return true;
		}
		
	}

  tv = (TextView) convertView;
            }else{
                tv = new TextView(getApplicationContext());
            }
            tv.setTextSize(20);
            tv.setTextColor(Color.BLACK);
            
            tv.setText("  "+childrenCacheInfos.get(groupPosition).get(childPosition));
            
            return tv;
        }
        
        //分组里面的子条目是否可以被点击,默认是false,复写这个方法,返回true
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
        
    }




             

adapter 中的几个重要的方法都有注释了,很详细,

分析: adapter 需要适配给UI 的数据,需要2个集合 一个list集合,对外层item 也就是groupView进行内容的填充

一个是一个map集合,对groupView下的childView 进行内容的填充 ; 根据map的key是groupView 的id .

重点来了,我们来 看第三个问题 groupView 下边有的有childVIew 有的没有childView ; 有的就直接全部显示出来,没有的下边直接什么都不显示;

通过实验,得出程序调用getChildView()这个方法之前,是先调用

getChildrenCount()这个方法,根据返回的child 的个数,来进行循环调用getChildView()这个方法,进行子childView进行init ;
当返回的child的个数是0的时候,getChildView()这个方法就不会被调用到了;所以当child个数==0 的时候 getChildView()这个方法里面的代码是不会执行的;
接下来的问题就是 根据 map.get(groupPosition) 返回的 ==null ,return 0; getChildView()这个方法就不会被调用到了;




接下来 我们来解决第二个问题

点击groupView 原生的方法效果是,显示和隐藏 childVIew ,而我要实现的效果是,groupVIew 点击跳转到一个界面 childView 点击跳转到一个界面;

改写原生的点击事件 ,在getGroupView()方法 中定义convertView.setOnClickListener();就可以屏蔽掉原来的点击事件;

childView的点击事件的编写也和上面查不多,重要的是adapter 里面最后一个方面,也就是

//分组里面的子条目是否可以被点击,默认是false,复写这个方法,返回true
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}

重新返回true ,才会调用childView的点击事件;

需要第一 显示的时候, groupView 和childView 都要显示。

这个问题 ,一开始的时候 还以为要重写这个Ui控件,通过查看源代码

/**
* Expand a group in the grouped list view
*
* @param groupPos the group to be expanded
* @return True if the group was expanded, false otherwise (if the group
* was already expanded, this will return false)
*/
public boolean expandGroup(int groupPos) {
return expandGroup(groupPos, false);
}

不错,

就是这个方法expandGroup() 作用是展开 groupeView ; 我们只需要在初始化所有的控件的时候 调用一个for循环 , for(int i=0;i<list.size;i++){

expandGroup(i)//就可以把所有的childView直接展开,并且我覆盖了groupView的点击事件,再点击也不会隐藏掉了;

}


/**
* Expand a group in the grouped list view
*
* @param groupPos the group to be expanded
* @param animate true if the expanding group should be animated in
* @return True if the group was expanded, false otherwise (if the group
* was already expanded, this will return false)
*/
public boolean expandGroup(int groupPos, boolean animate) {}

expandGroup(groupPos, false); //再说下这个方法吧,这个方法后面的boolean 是 判断childView是否已经显示,来控制childView显示隐藏的;



到这,三个问题,全部解决掉;PS,源码还是很重要啊。。。。。

 

 
 

 
 
 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值