在开发中接到一个功能要求在ListView中实现对CheckBox的全选,取消全选,删除的功能。
先上图
实现步骤:
1、创建TestAdapter 继承 BaseAdapter 并重写 四个方法
public class TestAdapter extends BaseAdapter {
private Context context;
private List<Map<String, String>> list;
//用来保存checkbox的状态
private Map<Integer, Boolean> map = new HashMap<>();
public TestAdapter(Context context, List<Map<String, String>> list) {
this.context = context;
this.list = list;
initCheck(false);
}
//初始化checkBox状态
public void initCheck(boolean flag) {
for (int i = 0; i < list.size(); i++) {
map.put(i, flag);
}
}
@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;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_test, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.itemTv.setText(list.get(position).get("value"));
viewHolder.itemCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
map.put(position, isChecked);
}
});
if (map.get(position) == null) {
map.put(position, false);
}
viewHolder.itemCheck.setChecked(map.get(position));
//判断是否为编辑状态
if ("false".equals(list.get(position).get("isHide"))) {
viewHolder.itemCheck.setVisibility(View.VISIBLE);
} else {
viewHolder.itemCheck.setVisibility(View.GONE);
}
return convertView;
}
class ViewHolder {
@BindView(R.id.item_check)
CheckBox itemCheck;
@BindView(R.id.item_tv)
TextView itemTv;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
public Map<Integer, Boolean> getMap() {
return map;
}
// 删除一个数据
public void removeData(int position) {
list.remove(position);
}
Activity代码
public class MainActivity extends AppCompatActivity {
@BindView(R.id.testListView)
ListView testListView;
@BindView(R.id.bottom_linear)
LinearLayout bottomLinear;
@BindView(R.id.checkAll)
Button checkAll;
@BindView(R.id.editBtn)
TextView editBtn;
private TestAdapter adapter;
private List<Map<String, String>> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initList();
}
private void initList() {
list = new ArrayList<>();
for (int i = 1; i < 10; i++) {
Map<String, String> map = new HashMap<>();
map.put("isHide", "true");
map.put("value", "测试数据" + i);
list.add(map);
}
adapter = new TestAdapter(this, list);
testListView.setAdapter(adapter);
}
@OnClick(R.id.editBtn)
public void onViewClicked() {
if ("完成".equals(editBtn.getText().toString().trim())) {
editBtn.setText("编辑");
bottomLinear.setVisibility(View.GONE);
for (int i = 0; i < list.size(); i++) {
list.get(i).put("isHide", "true");
adapter.notifyDataSetChanged();
}
} else {
editBtn.setText("完成");
bottomLinear.setVisibility(View.VISIBLE);
for (int i = 0; i < list.size(); i++) {
list.get(i).put("isHide", "false");
adapter.notifyDataSetChanged();
}
}
}
@OnClick({R.id.checkAll, R.id.delete})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.checkAll:
if ("全选".equals(checkAll.getText().toString())) {
adapter.initCheck(true);
checkAll.setText("全不选");
} else {
adapter.initCheck(false);
checkAll.setText("全选");
}
adapter.notifyDataSetChanged();
break;
case R.id.delete:
delete();
break;
}
}
private void delete() {
// 拿到所有数据
Map<Integer, Boolean> isCheck_delete = adapter.getMap();
// 获取到条目数量,map.size = list.size,所以
int count = adapter.getCount();
// 遍历
for (int i = 0; i < count; i++) {
// 删除有两个map和list都要删除 ,计算方式
int position = i - (count - adapter.getCount());
// 判断状态 true为删除
if (isCheck_delete.get(i) != null && isCheck_delete.get(i)) {
// listview删除数据
isCheck_delete.remove(i);
adapter.removeData(position);
}
}
adapter.notifyDataSetChanged();
}
}
ok,大功告成。