ListView CheckBox 全选,单选
最近做商城项目,在购物车模块有用到listView 和checkBox单选全选,所以在这里记录一下,和大家共勉。如果有不对的地方请多多指教 ,多多包含。话不多说上代码。
activity代码
/**
* @类说明 listView checkBox的单选 全选删除 适用于商城购物车模块
*
*/
public class SelectCheckBoxActivity extends Activity implements OnClickListener {
// 编辑按钮
private TextView txt_edit;
// 删除按钮
private TextView txt_delete;
// 全选按钮
private CheckBox select_all_check;
private ListView mlistView;
// 数据源
static String str[] = { "data1", "data2", "data3", "data4",
"data5",data6", "data7", "data8", "data9", "data10",
"data11", "data12","data13" };
private List<Map> list;
//适配器
private SelectBoxAdapter mAdapter;
// 存储选中的checkBox数量
List<Map> checkList = new ArrayList<Map>();
/**
* 状态 : 是否编辑
*/
private boolean isEdit = false;
private LinearLayout delete_all_linear;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_check_box);
initView();
initdata();
mAdapter = new SelectBoxAdapter(this, list);
mlistView.setAdapter(mAdapter);
}
private void initView() {
mlistView = (ListView) findViewById(R.id.listView);
txt_edit = (TextView) findViewById(R.id.txt_edit);
txt_delete = (TextView) findViewById(R.id.txt_delete);
select_all_check = (CheckBox) findViewById(R.id.check_selectall);
delete_all_linear = (LinearLayout) findViewById(R.id.delete_all_linear);
txt_edit.setOnClickListener(this);
select_all_check.setOnClickListener(this);
txt_delete.setOnClickListener(this);
mlistView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View arg1,
int position, long arg3) {
Map<String, String> item = list.get(position);
if (mAdapter.getEditState()) {
// 不是编辑状态 可点击item 处理item的点击事件
return;
} else {
// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤
ViewHolder holder = (ViewHolder) arg1.getTag();
holder.check_select.setFocusable(true);
// 改变CheckBox的状态
holder.check_select.toggle();
if (holder.check_select.isChecked()) {
/**
* 如果check_select == true 当前item 置为 true checkList里面
* 没有与当前选中的item相同的 就把当前选中item添加到checkList
*/
item.put("flag", "true");
if (!checkList.contains(item)) {
checkList.add(item);
}
} else {
/**
* 如果check_select == false 当前item 置为 FALSE
* 并且从checklist里面删除
*/
item.put("flag", "false");
checkList.remove(item);
}
// 根据选中的数量来控制全选按钮的状态
if (checkList.size() == list.size()) {
select_all_check.setChecked(true);
} else {
select_all_check.setChecked(false);
}
}
}
});
}
// 初始化数据
public void initdata() {
list = new ArrayList<Map>();
for (int i = 0; i < str.length; i++) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("content", str[i]);
map.put("flag", "false");
list.add(map);
}
}
/**
* 控制编辑按钮的显示
*
* @param edit
*/
private void toggle(boolean edit) {
if (edit) {
txt_edit.setText("编辑");
txt_delete.setVisibility(View.GONE);
delete_all_linear.setVisibility(View.GONE);
} else {
txt_edit.setText("完成");
delete_all_linear.setVisibility(View.VISIBLE);
txt_delete.setVisibility(View.VISIBLE);
}
select_all_check.setChecked(false);
mAdapter.setEditState(edit);
mAdapter.notifyDataSetChanged();
isEdit = !isEdit;
}
/**
* 编辑状态切换
*/
private void toggleStaus(View v) {
if (isEdit) {
restData();
toggle(true);
} else {
restData();
toggle(false);
}
}
// 每次编辑完成重置checkbox状态
private void restData() {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).get("flag").equals("true")) {
list.get(i).put("flag", "false");
checkList.clear();
}
}
mAdapter.notifyDataSetChanged();
}
@SuppressWarnings("unchecked")
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.txt_edit:// 切换编辑
toggleStaus(v);
break;
case R.id.txt_delete:// 删除
list.removeAll(checkList);
checkList.clear();
mAdapter.notifyDataSetChanged();
break;
case R.id.check_selectall:// 全选
if (select_all_check.isChecked() == true) {
for (int i = 0; i < list.size(); i++) {
list.get(i).put("flag", "true");
}
// 数量设为list的长度
checkList.addAll(list);
mAdapter.notifyDataSetChanged();
} else {
restData();
}
break;
}
}
}
适配器代码
public class SelectBoxAdapter extends BaseAdapter {
private Activity mContext;
private LayoutInflater inflater;
private List<Map> mList;
// 是否编辑完成
private boolean isEditState = true;
public SelectBoxAdapter(Activity context,List<Map> list) {
this.mContext = context;
this.mList = list;
inflater = LayoutInflater.from(mContext);
}
/**
* 切换 "编辑" "完成" 状态
*/
public void setEditState(boolean editState) {
this.isEditState = editState;
}
public boolean getEditState() {
return isEditState;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mHolder = null;
Map item = mList.get(position);
if(convertView == null){
mHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_checkbox, null);
mHolder.check_select = (CheckBox)convertView.findViewById(R.id.check_select);
mHolder.txt_select = (TextView)convertView.findViewById(R.id.txt_select);
convertView.setTag(mHolder);
}else {
mHolder = (ViewHolder)convertView.getTag();
}
mHolder.txt_select.setText(item.get("content").toString());
mHolder.check_select.setChecked(item.get("flag").equals("true"));
mHolder.check_select.setVisibility(isEditState ? View.GONE : View.VISIBLE);
return convertView;
}
class ViewHolder{
CheckBox check_select;
TextView txt_select;
}
}
代码其实挺简单的,在这里主要是想记录一下。完整的项目在我的qq群里面有,有想要源码的可以加我的技术群 174905615。大家一起交流学习,谢谢。