您的位置:首页 > 其它

ExpandableListView+CheckBox使用注意事项

2016-09-09 09:19 363 查看
最近做一个项目需要用到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;
}
}


本博客作为一个本人的经验记录,希望可以帮助到有问题的童鞋,如有不足,请指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息