CheckBox和ListView的结合使用

从一个菜BBBBB到一个菜鸡JJJJJJJ 也已经做安卓算是大半年了,虽然都是后期更新的一系列东西,但自己还是没有放弃停滞不前!最近开始有时间就上一些东西,大多数都是改写别人的东西,反正对于多数Coder来说解决需求才是第一位的,哈哈。。。也为自己的成长值做一些记录啦。!
亟亟–走向大牛之路开始!!

今天上的是一个ListView和CheckBox相结合的一个界面,资源来源于EOE一个小伙伴的素材。
初始样子
添加后的样子
废话不多,开始上代码!

public class MainActivity extends Activity implements OnClickListener,
        OnItemClickListener {

    /**
     * 返回按钮
     */
    private ViewGroup btnCancle = null;

    /**
     * 确定按钮
     */
    private ViewGroup btnAdd = null;

    /**
     * 选择所有
     */
    private Button btnSelectAll = null;

    /**
     * 清除所有
     */
    private Button btnDelete = null;

    /**
     * ListView列表
     */
    private ListView lvListView = null;

    /**
     * 适配对象
     */
    private DemoAdapter adpAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化视图
        initView();

        // 初始化控件
        initData();

    }

    /**
     * 初始化控件
     */
    private void initView() {

        btnCancle = (ViewGroup) findViewById(R.id.btnCancle);
        btnCancle.setOnClickListener(this);

        btnAdd = (ViewGroup) findViewById(R.id.btnAdd);
        btnAdd.setOnClickListener(this);

        btnDelete = (Button) findViewById(R.id.btnDelete);
        btnDelete.setOnClickListener(this);

        btnSelectAll = (Button) findViewById(R.id.btnSelectAll);
        btnSelectAll.setOnClickListener(this);

        lvListView = (ListView) findViewById(R.id.lvListView);
        lvListView.setOnItemClickListener(this);

    }

    /**
     * 初始化视图
     */
    private void initData() {

        // 模拟假数据
        List<DemoBean> demoDatas = new ArrayList<DemoBean>();

        demoDatas.add(new DemoBean("张三", true));
        demoDatas.add(new DemoBean("李四", true));
        demoDatas.add(new DemoBean("王五", false));
        demoDatas.add(new DemoBean("赵六", true));

        adpAdapter = new DemoAdapter(this, demoDatas);

        lvListView.setAdapter(adpAdapter);

    }

    /**
     * 按钮点击事件
     */
    @Override
    public void onClick(View v) {

        /*
         * 当点击返回的时候
         */
        if (v == btnCancle) {
            finish();

        }

        /*
         * 当点击增加的时候
         */
        if (v == btnAdd) {

            adpAdapter.add(new DemoBean("赵六", true));

            adpAdapter.notifyDataSetChanged();
        }

        /*
         * 当点击删除的时候
         */
        if (v == btnDelete) {


            /*
             * 删除算法最复杂,拿到checkBox选择寄存map
             */
            Map<Integer, Boolean> map = adpAdapter.getCheckMap();

            // 获取当前的数据数量
            int count = adpAdapter.getCount();

            // 进行遍历
            for (int i = 0; i < count; i++) {

                // 因为List的特性,删除了2个item,则3变成2,所以这里要进行这样的换算,才能拿到删除后真正的position
                int position = i - (count - adpAdapter.getCount());

                if (map.get(i) != null && map.get(i)) {

                    DemoBean bean = (DemoBean) adpAdapter.getItem(position);

                    if (bean.isCanRemove()) {
                        adpAdapter.getCheckMap().remove(i);
                        adpAdapter.remove(position);
                    } else {
                        map.put(position, false);
                    }

                }
            }

            adpAdapter.notifyDataSetChanged();

        }

        /*
         * 当点击全选的时候
         */
        if (v == btnSelectAll) {

            if (btnSelectAll.getText().toString().trim().equals("全选")) {

                // 所有项目全部选中
                adpAdapter.configCheckMap(true);

                adpAdapter.notifyDataSetChanged();

                btnSelectAll.setText("全不选");
            } else {

                // 所有项目全部不选中
                adpAdapter.configCheckMap(false);

                adpAdapter.notifyDataSetChanged();

                btnSelectAll.setText("全选");
            }

        }
    }

    /**
     * 当ListView 子项点击的时候
     */
    @Override
    public void onItemClick(AdapterView<?> listView, View itemLayout,
            int position, long id) {

        if (itemLayout.getTag() instanceof ViewHolder) {

            ViewHolder holder = (ViewHolder) itemLayout.getTag();

            // 会自动出发CheckBox的checked事件
            holder.cbCheck.toggle();

        }

    }
}

界面简单4个按钮+1个ListView自己使用时,可以只使用ListView即可。
再附上Bean对象代码

public class DemoBean {

    private String title;


    /**
     * 标识是否可以删除
     */
    private boolean canRemove = true;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public boolean isCanRemove() {
        return canRemove;
    }

    public void setCanRemove(boolean canRemove) {
        this.canRemove = canRemove;
    }

    public DemoBean(String title, boolean canRemove) {
        this.title = title;
        this.canRemove = canRemove;
    }

    public DemoBean() {
    }

}

再是填充数据的Adapter部分的代码

public class DemoAdapter extends BaseAdapter {

    /**
     * 上下文对象
     */
    private Context context = null;

    /**
     * 数据集合
     */
    private List<DemoBean> datas = null;

    /**
     * CheckBox 是否选择的存储集合,key 是 position , value 是该position是否选中
     */
    private Map<Integer, Boolean> isCheckMap = new HashMap<Integer, Boolean>();

    public DemoAdapter(Context context, List<DemoBean> datas) {
        this.datas = datas;
        this.context = context;

        // 初始化,默认都没有选中
        configCheckMap(false);
    }

    /**
     * 首先,默认情况下,所有项目都是没有选中的.这里进行初始化
     */
    public void configCheckMap(boolean bool) {

        for (int i = 0; i < datas.size(); i++) {
            isCheckMap.put(i, bool);
        }

    }

    @Override
    public int getCount() {
        return datas == null ? 0 : datas.size();
    }

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

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        ViewGroup layout = null;

        /**
         * 进行ListView 的优化
         */
        if (convertView == null) {
            layout = (ViewGroup) LayoutInflater.from(context).inflate(
                    R.layout.listview_item_layout, parent, false);
        } else {
            layout = (ViewGroup) convertView;
        }

        DemoBean bean = datas.get(position);

        /*
         * 获得该item 是否允许删除
         */
        boolean canRemove = bean.isCanRemove();

        /*
         * 设置每一个item的文本
         */
        TextView tvTitle = (TextView) layout.findViewById(R.id.tvTitle);
        tvTitle.setText(bean.getTitle());

        /*
         * 获得单选按钮
         */
        CheckBox cbCheck = (CheckBox) layout.findViewById(R.id.cbCheckBox);

        /*
         * 设置单选按钮的选中
         */
        cbCheck.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {

                /*
                 * 将选择项加载到map里面寄存
                 */
                isCheckMap.put(position, isChecked);
            }
        });

        if (!canRemove) {
            // 隐藏单选按钮,因为是不可删除的
            cbCheck.setVisibility(View.GONE);
            cbCheck.setChecked(false);
        } else {
            cbCheck.setVisibility(View.VISIBLE);

            if (isCheckMap.get(position) == null) {
                isCheckMap.put(position, false);
            }

            cbCheck.setChecked(isCheckMap.get(position));

            ViewHolder holder = new ViewHolder();

            holder.cbCheck = cbCheck;

            holder.tvTitle = tvTitle;

            /**
             * 将数据保存到tag
             */
            layout.setTag(holder);
        }

        return layout;
    }

    /**
     * 增加一项的时候
     */
    public void add(DemoBean bean) {
        this.datas.add(0, bean);

        // 让所有项目都为不选择
        configCheckMap(false);
    }

    // 移除一个项目的时候
    public void remove(int position) {
        this.datas.remove(position);
    }

    public Map<Integer, Boolean> getCheckMap() {
        return this.isCheckMap;
    }

    public static class ViewHolder {

        public TextView tvTitle = null;

        public CheckBox cbCheck = null;
        public Object data = null;

    }

    public List<DemoBean> getDatas() {
        return datas;
    }

}

再是布局XML的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dip"
        android:background="#FF42426F"
        android:orientation="horizontal" >

        <RelativeLayout
            android:id="@+id/btnCancle"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/btn_pressed_style"
            android:clickable="true" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:clickable="false"
                android:text="返回"
                android:textColor="@android:color/white"
                android:textSize="16sp" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="3" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:clickable="false"
                android:text="ListView+CheckBox"
                android:textColor="@android:color/white"
                android:textSize="16sp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/btnAdd"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/btn_pressed_style"
            android:clickable="true" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:clickable="false"
                android:text="增加"
                android:textColor="@android:color/white"
                android:textSize="16sp" />
        </RelativeLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="#ECEFF0" >

        <ListView
            android:id="@+id/lvListView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="#DADBDA"
            android:dividerHeight="1px"
            android:fadingEdge="none" >
        </ListView>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="#FF42426F" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_alignParentBottom="true"
        android:background="#0BA683"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btnDelete"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#FF42426F"
            android:text="删除"
            android:textColor="#FDFEFE"
            android:textSize="16sp" />

        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="#FF42426F" />

        <Button
            android:id="@+id/btnSelectAll"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#FF42426F"
            android:text="全选"
            android:textColor="#FDFEFE"
            android:textSize="16sp" />
    </LinearLayout>

</LinearLayout>

最后附上,颜色引用资源的代码

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><color android:color="#FF42426F" />
    </item>

</selector>

OK啦!就是这么简单,谢谢支持多点赞哈!
附上源码下载
提取码:9fcf
欢迎各位喜欢一起进步的朋友+QQ:452270579探讨。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值