ExpandableListView+CheckBox使用注意事项

最近做一个项目需要用到ExpandableListView+CheckBox来做一个全选的功能,刚开始写完后adapter里面的notifyDataSetChanged()不起作用,不能刷新。在网上搜了才明白。具体原理详见http://blog.csdn.net/wuzhipeng1991/article/details/38820647?utm_source=tuicool&utm_medium=referral

总结一下,注意事项:
1、在adapter之前new一个list集合,后续都对这个集合进行操作。
如:List<GroupBean> groupBeans = new ArrayList<>();
MyExpandableListAdapter expandableListAdapter = new MyExpandableListAdapter(groupBeans,CheckTermActivity.this);
primeExpandListView.setAdapter(expandableListAdapter);
把解析出来的数据直接addAll到groupBeans中,这样就可以保证指向的一直是哪一个内存块。

2、如果在getView方法中要对checkBox进行选中改变,调用了setChecked(),则对checkBox进行状态改变监听时最好不要用到OnCheckedChangeListener,要用OnClickListener,因为在getView中对checkBox的选中状态进行了改变,那么就会电泳OnCheckChange(),会频繁调用,也可能会影响功能实现。

adapter具体代码附上

public class MyExpandableListAdapter extends BaseExpandableListAdapter {

    private List<CheckTermGroupBean> checkTermGroupBeans;
    private Context context;
    private String wujiao = "☆";

    public MyExpandableListAdapter(List<CheckTermGroupBean> checkTermGroupBeans,Context context) {
        this.checkTermGroupBeans = checkTermGroupBeans;
        this.context = context;
    }

    public List<CheckTermGroupBean> getCheckTermGroupBeans() {
        return checkTermGroupBeans;
    }


    @Override
    public int getGroupCount() {
        return checkTermGroupBeans.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return checkTermGroupBeans.get(groupPosition).getChildCount();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return checkTermGroupBeans.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return checkTermGroupBeans.get(groupPosition).getChild(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

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

    @Override
    public boolean hasStableIds() {
        return false;
    }
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    @Override
    public View getGroupView( int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        GroupHolder groupHolder;
        if(convertView==null) {
            groupHolder = new GroupHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.expanditem_group, null);
            groupHolder.groupCheckBox = (CheckBox) convertView.findViewById(R.id.cb_groupitem);
            convertView.setTag(groupHolder);
        } else{
            groupHolder = (GroupHolder) convertView.getTag();
        }
        groupHolder.groupCheckBox.setText(checkTermGroupBeans.get(groupPosition).getGroupName());
        groupHolder.groupCheckBox.setChecked(checkTermGroupBeans.get(groupPosition).getChecked());
        groupHolder.groupCheckBox.setOnClickListener(new Group_CheckBox_Click(groupPosition,groupHolder));


        return convertView;
    }


    class Group_CheckBox_Click implements View.OnClickListener {
        private int groupPosition;
        private GroupHolder groupHolder;


        Group_CheckBox_Click(int groupPosition,GroupHolder groupHolder) {
            this.groupPosition = groupPosition;
            this.groupHolder = groupHolder;
        }

        public void onClick(View v) {
            groupHolder.groupCheckBox.setChecked(!checkTermGroupBeans.get(groupPosition).getChecked());
            checkTermGroupBeans.get(groupPosition).toggle();
            int childrenCount = checkTermGroupBeans.get(groupPosition).getChildCount();
            boolean groupIsChecked = checkTermGroupBeans.get(groupPosition).getChecked();
            for (int i = 0; i < childrenCount; i++) {
                checkTermGroupBeans.get(groupPosition).getChild(i).setIsCheck(groupIsChecked);
            }

            notifyDataSetChanged();
        }
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) {
        ChildHolder childHolder;
        if(convertView==null) {
            childHolder = new ChildHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.expanditem_child, null);
            childHolder.childCheckBox = (CheckBox) convertView.findViewById(R.id.cb_childitem);
            convertView.setTag(childHolder);
        }else{
            childHolder = (ChildHolder) convertView.getTag();
        }
        if("0".equals(checkTermGroupBeans.get(groupPosition).getChild(childPosition).getIsInLaw())){
            childHolder.childCheckBox.setText(checkTermGroupBeans.get(groupPosition).getChild(childPosition).getTitle());
            childHolder.childCheckBox.setTextColor(context.getResources().getColor(R.color.black));
        }else{
            childHolder.childCheckBox.setText(wujiao+checkTermGroupBeans.get(groupPosition).getChild(childPosition).getTitle());
            childHolder.childCheckBox.setTextColor(context.getResources().getColor(R.color.red));
        }

        childHolder. childCheckBox.setChecked(checkTermGroupBeans.get(groupPosition).getChild(childPosition).isCheck());
        childHolder.childCheckBox.setOnClickListener(new Child_CheckBox_Click(groupPosition, childPosition,childHolder));
        return convertView;
    }


    class Child_CheckBox_Click implements View.OnClickListener {
        private int groupPosition;
        private int childPosition;
        private ChildHolder childHolder;

        Child_CheckBox_Click(int groupPosition, int childPosition,ChildHolder childHolder) {
            this.groupPosition = groupPosition;
            this.childPosition = childPosition;
            this.childHolder = childHolder;
        }

        public void onClick(View v) {
            childHolder.childCheckBox.setChecked(!checkTermGroupBeans.get(groupPosition).getChild(childPosition).isCheck());
            changeChecked(childPosition, groupPosition);
        }
    }

    public void changeChecked(int childPosition, int groupPosition) {
        checkTermGroupBeans.get(groupPosition).getChild(childPosition).toggle();

        int childrenCount = checkTermGroupBeans.get(groupPosition).getChildCount();
        boolean childrenAllIsChecked = true;
        for (int i = 0; i < childrenCount; i++) {
            if (!checkTermGroupBeans.get(groupPosition).getChild(i).isCheck())
                childrenAllIsChecked = false;
        }

        checkTermGroupBeans.get(groupPosition).setChecked(childrenAllIsChecked);
        notifyDataSetChanged();
    }


    class GroupHolder{
        CheckBox groupCheckBox;
    }
    class ChildHolder{
        CheckBox childCheckBox;
    }
}

本博客作为一个本人的经验记录,希望可以帮助到有问题的童鞋,如有不足,请指教

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值