在做一些和人相关的app的时候,往往少不了对人进行选择的功能,有时需要单选、有时需要多选、或者连带着选择人数的变化,这里先贴多选人数带数量监听的代码。也是先上图
这个功能的实现很简单,主要就是在adapter中提供获取选中数字变化的借口方法,在activity里通过对总的集合尺寸和已选数量的大小进行比较,从而在界面上进行直观的展示
代码的实体类很简单,只有名称和是否选中的标记两个属性
// activity
public class Activity_Check_Person extends Activity {
private ListView listview;
private TextView tv_selcted_number;
private MemberAdapter adapter;
private List
memberBeanList = new ArrayList<>();
private CheckBox cb_check_all;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check__person);
setBaseData();
initId();
adapter = new MemberAdapter(this, memberBeanList);
listview.setAdapter(adapter);
setListener();
}
private void setListener() {
cb_check_all.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!cb_check_all.isChecked()) {//之前没选中
cb_check_all.setChecked(false);
for (int i = 0; i < memberBeanList.size(); i++) {
memberBeanList.get(i).setSelected(false);
}
} else {
cb_check_all.setChecked(true);
for (int i = 0; i < memberBeanList.size(); i++) {
memberBeanList.get(i).setSelected(true);
}
}
adapter.notifyDataSetChanged();
}
});
MemberAdapter.SelectedallListener listener = new MemberAdapter.SelectedallListener() {
@Override
public void selected(boolean b, int count) {
if (memberBeanList != null && memberBeanList.size() > 0) {
Log.e("size()", "====" + memberBeanList.size() + "count" + "======" + count);
if (memberBeanList.size() == count) {
cb_check_all.setChecked(true);
} else {
cb_check_all.setChecked(false);
}
tv_selcted_number.setText("已选" + "(" + count + ")人");
}
}
};
adapter.setListener(listener);
}
private void initId() {
listview = (ListView) findViewById(R.id.lv_member);
tv_selcted_number = (TextView) findViewById(R.id.tv_selcted_number);
cb_check_all = (CheckBox) findViewById(R.id.cb_check_all);
}
/**
* 设置基本数据
*/
private void setBaseData() {
String[] names = {"张艺萌", "蘑菇力", "李飞", "果果", "小月月", "尼古拉斯", "巴托姆", "麻麻咪", "艾丽斯", "张木国"};
for (String name : names) {
MemberBean bean = new MemberBean();
bean.setName(name);
memberBeanList.add(bean);
}
}
}
布局 如下
// item item布局
// 按钮
// aadapter
public class MemberAdapter extends BaseAdapter {
private List
memberBeanList;
private Context context;
private LayoutInflater layoutInflater;
private SelectedallListener listener;
public MemberAdapter(Context context, List
memberBeanList) {
this.memberBeanList = memberBeanList;
this.context = context;
layoutInflater = LayoutInflater.from(context);
}
public void setListener(SelectedallListener listener) {
this.listener = listener;
}
public interface SelectedallListener {
void selected(boolean b, int count);
}
@Override
public int getCount() {
return memberBeanList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.item_list, parent, false);
holder.tv_taskmember_name = (TextView) convertView.findViewById(R.id.tv_name);
holder.rb_member = (CheckBox) convertView.findViewById(R.id.rb_check);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final MemberBean memberBean = memberBeanList.get(position);
holder.tv_taskmember_name.setText(memberBean.getName());
holder.rb_member.setSelected(memberBean.isSelected());//设置按钮的选中状态
if (memberBean.isSelected()) {
holder.rb_member.setBackgroundResource(R.drawable.radiobtn_checked);
} else {
holder.rb_member.setBackgroundResource(R.drawable.radiobtn_normal);
}
//当点击复选按钮时候,改变实体类的属性
holder.rb_member.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
memberBean.setSelected(b);
listener.selected(b, selectedNumber());
notifyDataSetChanged();//刷新adapter
}
});
return convertView;
}
class ViewHolder {
TextView tv_taskmember_name;
CheckBox rb_member;
}
/**
* 选中数据的个数
*
* @return
*/
private int selectedNumber() {
int count = 0;
for (MemberBean bean : memberBeanList) {
if (bean.isSelected()) {
count = count + 1;
}
}
return count;
}
/**
* 更新数据
*
* @param list
*/
public void notifyAdapter(List
list) {
this.memberBeanList = list;
notifyDataSetChanged();
}
}
代码逻辑也很简单哦,之前也做过单选的功能,网上的代码也有很多,但我个人觉得对于这类的功能,用标记来实现最简单,虽然很蠢O(∩_∩)O哈哈~