ExpandableListView在onAvtivityResult方法里面展开group不成功

来源:互联网 发布:域名如何更换 编辑:程序博客网 时间:2024/04/29 00:55

今天实现ExpandableListView展开和关闭group功能时,重写了onActivityResult方法和onResume方法。


首先要知道展开group的方法是:

exList.expandGroup(groupPosition);//groupPosition的值从0开始


闭合group的方法是:

exList.collapseGroup(groupPosition);//groupPosition的值从0开始


其中,exList是ExpandableListView的对象。


onActivityResult方法是用来处理从第二个activity里面传回来的数据;onResume方法在启动activity时候回被自动执行,在我的项目中是为了刷新ExpandableListView子列表里面的内容,使用重新获取子列表内容和重新设置adapter的方法刷新内容。重新设置adapter就会把所有group都设置为非展开状态。


我想要在第二个activity(项目中是RecordNewItemActivity)被finish掉的时候将修改的数据分类传回给第一个activity(项目中是GuideActivity),所以在GuideActivity里面使用

startActivityForResult(intent,0);//第二个参数可以是大于等于0的任意值


并且在RecordNewItemActivity里面用
setResult(RESULT_OK,intent);


将intent传回给GuideActivity
然后在onActivityResult方法里面处理返回来的数据。
如果直接在onActivityResult方法中设置group展开,代码如下:
@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (resultCode){            case RESULT_OK:                Bundle bundle = data.getExtras();                type_result = bundle.getString("type");                for(int i = 0;i<type.length;i++){                    if( type[i].equals(type_result)){                        Toast.makeText(context,""+type[i].equals(type_result),Toast.LENGTH_SHORT).show();                        exList.expandGroup(i);                    }                }                break;        }    }

这样运行之后不能展开group,但是Toast确确实实已经被执行了!

下面是onResume方法的代码:

 /**     *用于实现当从其他activity返回到该activity时,刷新该activity的列表内容     */    @Override    protected void onResume() {        super.onResume();        refrash();    }

refrash方法的代码如下:

/**     * 刷新列表内容     */    public void refrash(){        getChildsContent();// adapter.notifyDataSetChanged();        setListData();    }

getChildsContent方法用来从SQLite里面读取到每个分组的内容。
setListData方法用来为ExpandableListView的对象exList添加适配器。代码如下:

/**     * 设置列表里面的内容     */    public void setListData() {        adapter = new MyBaseExpandableListAdapter(context,groups,childs_name,childs_account);        setListAdapter(adapter);    }


通过测试发现onResume方法的执行是在onActivityResult方法之后。onActivityResult方法展开了group,但是在执行onResume方法后,因为重新设置了adapter,所以加载后的exList是所有group都闭合的,因此展开的group又被闭合了。这就是错误所在!


于是修改代码,让expandGroup方法在refrash方法里面执行,正确的代码是这样的:
@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (resultCode){            case RESULT_OK:                Bundle bundle = data.getExtras();                type_result = bundle.getString("type");                break;        }    }

/**     * 刷新列表内容     */    public void refrash(){        getChildsContent();// adapter.notifyDataSetChanged();        setListData();        for(int i = 0;i<type.length;i++){            if( type[i].equals(type_result)){                Toast.makeText(context,""+type[i].equals(type_result),Toast.LENGTH_SHORT).show();                exList.expandGroup(i);            }        }    }

这样在finish掉RecordNewItemActivity之后,GuideActivity首先执行onActivityResult方法,获取到了从RecordNewItemActivity传回来的值,然后执行onResume方法。onResume方法首先重新添加适配器,这时的分组都是闭合着的,然后判断应该哪一组展开并设置展开,这样闭合的group就被展开了。任务完成。


总结一下:
1.展开group的方法是exList.expandGroup(groupPosition);
2.闭合group的方法是exList.collapseGroup(groupPosition);
3.当需要同时重写onResume方法和onActivityResult方法时,两个方法的执行顺序是:先执行onActivityResult方法,然后执行onResume方法,所有有些操作一定要想好应该怎么执行!


总算是解决了这个小问题,心里畅快多了!
0 0
原创粉丝点击