我们之前用过ListView实现过QQ消息列表,今天我们来用ListView实现一下商城购物车列表,这个跟QQ其实差不多只是我们这次item中的控件除了ImageView和TextView之外,又多了一个多选框(CheckBox)。
相信大家都用过京东淘宝,当我们想要删除购物车里的全部东西,而东西又很多的时候,我们会点击全选按钮,然后点击删除,除此之外还有点击单个条目的勾选框然后删除的功能。话不多说,我们现在开始。
1.先创建一个listView的条目布局
很简单的一个条目,分别指定三个控件的id(从左到右)item_checkbox、item_pic、item_name
2.然后在activity.xml中添加一个ListView的标签。id指定为mLv(简单粗暴)
3.添加适配器。我们创建一个MyListAdapter,继承BaseAdapter。
创建的同时我们在里面传入了两个参数,上下文和数据源。List中的类型为我们自定义的商品类型。然后我们创建一个Goods的类。
创建了Goods类并添加了需要的属性和对应需要的方法。
我们接着改写我们的适配器。
重写四个方法应该大家都知道了,这里getView我直接用Viewholder了。
4.现在适配器也写完了,我们就可以在活动中添加数据了。
我们在bean方法里添加了20个假数据。然后传入mList,最后给ListView添加适配器。现在我们来跑一下。
有点丑是吧,不过不要紧,今天我们不管他丑不丑,我们只想实现他的功能。
我们现在点击每个条目最左侧的复选框,是可以点击的对吧,但是我们点完了往上拉再拉下来,你会发现刚才点的钩没了,这是因为我们刚才只是让这个控件成为选中状态,但是在数据中我们的数据还是默认的false(未选中状态)。
而更改数据有两种方法:用点击事件(onClickListener)和改变时间(onItemChangeListener)我们一种一种方法实现:
1.onClickListener实现:
我们先想一下数据拉上去钩显示的原因:是因为我们再拉上去他又进入了getView方法,也就是每次加载都是进入getView方法里,所以我们要在getView方法里面添加点击事件。
仔细看我写的逻辑,我们在getView中添加了holder存储的CheckBox控件的点击事件。在点击后,如果对应position的数据中是未选中状态(存储的是false),则把它改成true,不是的话相反。现在我们再点击后下拉,会发现拉上去以后钩还是钩,没有消失。
2.通过setOnCheckedChangeListener实现:
(大家注意我写的顺序,先实现了监听器,之后才给holder添加了数据,具体原因很复杂,,,跟listView的复用机制和一些其他原因有关。以后有机会再说)
这个逻辑看着就更简单了,我们在进入了onCheckChanged方法后,他传入了一个isChecked参数,这个参数是我们点击了以后他改变了的值,也就是说如果之前我们没选中,值应该是false,而点击了以后它就是true,这个跟上面不太一样,
好了,现在单选我们就已经完成了,而且可以成功的保存数据,下面我们来完成删除和全选功能:
首先在activity.xml中添加两个按钮,用作删除和全选按钮。
好了,然后我们实现这两个按钮的点击事件。(大家都会,这里就不写了)我们主要看事件里面的是实现逻辑:
我们全选通过对数据源进行遍历,然后把每个对象的属性都改成true,最后调用一个adapter的notifydatachanged方法就好了。
而删除我们同样是遍历数据源,然后将属性为true的添加到一个新的List集合中,之后调用removeAll方法删除,最后调用一个adapter的notifydatachanged方法。