ExpandableListView 改变属性

来源:互联网 发布:海淘网站哪个好 知乎 编辑:程序博客网 时间:2024/06/05 18:32


今天要实现的 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 stubreturn 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的viewpublic 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,复写这个方法,返回truepublic 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,源码还是很重要啊。。。。。

 

	
				
		
原创粉丝点击