今天要实现的 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,源码还是很重要啊。。。。。