Android ListView单选CheckBox

思路
1触发事件setOnItemClickListener改变CheckBox
2在适配器的getView()里改变CheckBox状态,需要记录选中的CheckBox位置
3适配器提供方法改变CheckBox
4用notifyDataSetChanged启动getView()
实现代码

//适配器
public class MyAdapter extends BaseAdapter {
        // 填充数据的list
        private ArrayList<Map<String, Object>> list;
        // 用来控制CheckBox的选中状况
        private HashMap<Integer,Boolean> isSelected;
        // 上下文
        private Context context;
        // 用来导入布局
        private LayoutInflater inflater = null;

        // 构造器
        public MyAdapter(ArrayList<Map<String, Object>> list, Context context) {
            this.context = context;
            this.list = list;
            inflater = LayoutInflater.from(context);
            isSelected = new HashMap<Integer, Boolean>();
            // 初始化数据
            initDate();
        }

        // 初始化isSelected的数据
        private void initDate(){
            for(int i=0; i<list.size();i++) {
                getIsSelected().put(i,false);
            }
        }

        @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(int position, View convertView, ViewGroup parent) {

            // 导入布局并赋值给convertview
            convertView = inflater.inflate(R.layout.item_exchange_self, null);
            TextView tv_name = (TextView) convertView.findViewById(R.id.exchange_self_name);
            TextView tv_address = (TextView) convertView.findViewById(R.id.exchange_self_address);
            TextView tv_date = (TextView) convertView.findViewById(R.id.exchange_self_date);
            CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.select_address);
            // 设置list中TextView的显示
            tv_name.setText(list.get(position).get("name").toString());
            tv_address.setText(list.get(position).get("address").toString());
            tv_date.setText(list.get(position).get("workDates").toString());
            // 根据isSelected来设置checkbox的选中状况
            checkBox.setChecked(getIsSelected().get(position));
            return convertView;
        }

        public HashMap<Integer,Boolean> getIsSelected() {
            return isSelected;
        }

        public void setIsSelected(int postiton) {
            initDate();
            this.isSelected.put(postiton, true);
            notifyDataSetChanged();
        }
    }
//ListView
ListView exchangeCenters = (ListView) findViewById(R.id.exchange_centers);
        final MyAdapter myadapter = new MyAdapter(getData(),this);
        exchangeCenters.setAdapter(myadapter);
        exchangeCenters.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                myadapter.setIsSelected(position);
                exchangeCenter = getData().get(position);
            }
        });

布局的注意事项
1.CheckBox自身的点击要关闭,添加属性android:clickable=”false”
2.item的总部局需要加android:descendantFocusability=”blocksDescendants”保证ListView点击事件正常
3.ListView属性加android:layout_weight=”1”保证不会覆盖下方的按钮

你可能感兴趣的:(android)