您的位置:首页 > 移动开发 > Android开发

Android CheckBox显示错位的解决 && SparseBooleanArray的使用

2015-11-16 11:49 696 查看
在开发中遇到CheckBox的选中/未选中 显示错乱的问题

解决方法:

1. 在Adpater中定义一个CheckBox的状态列表(用SparseBooleanArray取代HashMap<Integer,Boolean>)

2. 在getView()中,给CheckBox添加监听器OnCheckedChangeListener

代码如下:

public class MultiSelectLevelTwoAdapter extends BaseAdapter {

/* 填充数据列表 */
private List<Map<String, Object>> list;
/* 用来导入布局 */
private LayoutInflater mInflater = null;
/* CheckBox状态列表 */
private SparseBooleanArray sbaState;

// 构造器
public AcatMultiSelectLevelTwoAdapter(Context context,
List<Map<String, Object>> list, LinkedHashSet<String> conditionSet) {
this.list = list;
mInflater = LayoutInflater.from(context);
sbaState = new SparseBooleanArray();
for (int i = 0; i < list.size(); i++) {
if (conditionSet.contains(list.get(i).get(
CommonConstants.MULTI_SELECT_LIST_KEY_INFO))) {
sbaState.put(i, true);
}
}
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

MultiSelLvTwoViewHolder holder;
if (convertView == null) {
// 获得ViewHolder对象
holder = new MultiSelLvTwoViewHolder();
// 导入布局
convertView = mInflater.inflate(
R.layout.acat_listitem_multi_select_level_two, null);
holder.tvId = (TextView) convertView.findViewById(R.id.tvId);
holder.tvInfo = (TextView) convertView.findViewById(R.id.tvInfo);
holder.cbItem = (CheckBox) convertView.findViewById(R.id.cbItem);
// 设置标签
convertView.setTag(holder);
} else {
holder = (MultiSelLvTwoViewHolder) convertView.getTag();
}

// 设置列表的显示信息
String id = list.get(position).get(CommonConstants.MULTI_SELECT_LIST_KEY_INFO)
.toString();
String info = list.get(position).get(CommonConstants.MULTI_SELECT_LIST_KEY_TITLE)
.toString();
holder.tvId.setText(id);
holder.tvInfo.setText(info);
/**
* ==============================================
* -------点击事件:CB修改时,变更CB状态列表------
* ==============================================
*/
holder.cbItem.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
sbaState.put(position, isChecked);
} else {
sbaState.delete(position);
}
}
});
holder.cbItem.setChecked(sbaState.get(position, false));

return convertView;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: