扣丁学堂解析Android Studio实现简单购物车功能及源码
今天扣丁学堂Android培训给大家分享了Android Studio实现简单购物车功能及源码,下面我们一起来看一下吧。
MainActivity的布局文件
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/top_bar"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#E24146"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:minheight="48dp"
android:text="购物车"
android:textColor="#ffffff"
android:textSize="17sp"/>
</LinearLayout>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:childIndicator="@null"
android:groupIndicator="@null">
</ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2.5"
android:gravity="center_vertical"
android:orientation="horizontal">
<CheckBox
android:id="@+id/all_chekbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="4dp"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:gravity="center"
android:minheight="64dp"
android:paddingLeft="10dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:visibility="visible"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="合计:"
android:textSize="16sp"
android:textstyle="bold"/>
<TextView
android:id="@+id/tv_total_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥0.00"
android:textSize="16sp"
android:textstyle="bold"/>
</LinearLayout>
<TextView
android:id="@+id/tv_delete"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:clickable="true"
android:background="#a29e9e"
android:gravity="center"
android:text="删除"
android:textColor="#FAFAFA"/>
<TextView
android:id="@+id/tv_go_to_pay"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#E24146"
android:clickable="true"
android:gravity="center"
android:text="付款(0)"
android:textColor="#FAFAFA"/>
</LinearLayout>
</LinearLayout>
条目的布局文件
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#CCCCCC"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/check_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="4dp"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:gravity="center"
android:minheight="64dp"
android:minwidth="32dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:visibility="visible"/>
<ImageView
android:id="@+id/iv_adapter_list_pic"
android:layout_width="85dp"
android:layout_height="85dp"
android:layout_marginBottom="15dp"
android:layout_marginTop="13dp"
android:scaleType="centerCrop"
android:src="@mipmap/ic_launcher"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginTop="10dp"
android:layout_marginLeft="13dp">
<TextView
android:id="@+id/tv_goods_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:ellipsize="end"
android:maxLines="2"
android:text="商品"
android:textSize="14sp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_goods_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:singleLine="true"
android:textSize="14sp"
android:textstyle="bold"
android:text="价格"/>
<TextView
android:id="@+id/tv_type_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/tv_goods_price"
android:singleLine="true"
android:textSize="10sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_reduce"
android:layout_width="25dp"
android:layout_height="25dp"
android:gravity="center"
android:background="#ccc"
android:text="一"
android:textSize="12sp"/>
<TextView
android:id="@+id/tv_num"
android:layout_width="25dp"
android:layout_height="25dp"
android:gravity="center"
android:singleLine="true"
android:text="1"
android:textSize="12sp"/>
<TextView
android:id="@+id/tv_add"
android:layout_width="25dp"
android:layout_height="25dp"
android:gravity="center"
android:text="十"
android:background="#ccc"
android:textSize="12sp"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
CartAdapter适配器
publicclassCaetAdapterextendsBaseAdapter{
privateContextcontext;
privateList<HashMap<String,String>>list;
privateHashMap<String,Integer>pitchOnMap;
publicHashMap<String,Integer>getPitchOnMap(){
returnpitchOnMap;
}
publicvoidsetPitchOnMap(HashMap<String,Integer>pitchOnMap){
this.pitchOnMap=pitchOnMap;
}
publicCaetAdapter(Contextcontext,List<HashMap<String,String>>list){
this.context=context;
this.list=list;
pitchOnMap=newHashMap<>();
for(inti=0;i<list.size();i++){
pitchOnMap.put(list.get(i).get("id"),0);
}
}
@Override
publicintgetCount(){
returnlist.size();
}
@Override
publicObjectgetItem(intposition){
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){
convertView=View.inflate(context,R.layout.item_layout,null);
finalCheckBoxcheckBox;
ImageViewicon;
finalTextViewname,price,num,type,reduce,add;
checkBox=convertView.findViewById(R.id.check_box);
icon=convertView.findViewById(R.id.iv_adapter_list_pic);
name=convertView.findViewById(R.id.tv_goods_name);
price=convertView.findViewById(R.id.tv_goods_price);
type=convertView.findViewById(R.id.tv_type_size);
num=convertView.findViewById(R.id.tv_num);
reduce=convertView.findViewById(R.id.tv_reduce);
add=convertView.findViewById(R.id.tv_add);
name.setText(list.get(position).get("name"));
price.setText("¥"+(Integer.valueOf(list.get(position).get("price")))*(Integer.valueOf(list.get(position).get("count"))));
type.setText(list.get(position).get("type"));
num.setText(list.get(position).get("count"));
if(pitchOnMap.get(list.get(position).get("id"))==0){
checkBox.setChecked(false);
}else{
checkBox.setChecked(true);
}
checkBox.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
if(checkBox.isChecked()){
pitchOnMap.put(list.get(position).get("id"),1);
}else{
pitchOnMap.put(list.get(position).get("id"),0);
}
mrefreshPriceInterface.refreshPrice(pitchOnMap);
}
});
//商品数量减
reduce.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
if(Integer.valueOf(list.get(position).get("count"))<=1){
Toast.makeText(context,"数量不能再减啦,只能删除!",Toast.LENGTH_SHORT).show();
}else{
list.get(position).put("count",(Integer.valueOf(list.get(position).get("count"))-1)+"");
notifyDataSetChanged();
}
mrefreshPriceInterface.refreshPrice(pitchOnMap);
}
});
//商品数量加
add.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
list.get(position).put("count",(Integer.valueOf(list.get(position).get("count"))+1)+"");
notifyDataSetChanged();
mrefreshPriceInterface.refreshPrice(pitchOnMap);
}
});
returnconvertView;
}
/**
*创建接口
*/
publicinterfaceRefreshPriceInterface{
/**
*把价格展示到总价上
*@parampitchOnMap
*/
voidrefreshPrice(HashMap<String,Integer>pitchOnMap);
}
/**
*定义一个接口对象
*/
privateRefreshPriceInterfacemrefreshPriceInterface;
/**
*向外部暴露一个方法
*把价格展示到总价上
*@paramrefreshPriceInterface
*/
publicvoidsetRefreshPriceInterface(RefreshPriceInterfacerefreshPriceInterface){
mrefreshPriceInterface=refreshPriceInterface;
}
}
MainActivity
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener,CaetAdapter.RefreshPriceInterface{
privateLinearLayouttop_bar;
privateListViewlistview;
privateCheckBoxall_chekbox;
privateTextViewprice;
privateTextViewdelete;
privateTextViewtv_go_to_pay;
privateList<User>goodsList;
privateUserDaouserDao;
privateList<HashMap<String,String>>listmap=newArrayList<>();
privateCaetAdapteradapter;
privatedoubletotalPrice=0.00;
privateinttotalCount=0;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
privatevoidinitView(){
top_bar=(LinearLayout)findViewById(R.id.top_bar);
listview=(ListView)findViewById(R.id.listview);
all_chekbox=(CheckBox)findViewById(R.id.all_chekbox);
price=(TextView)findViewById(R.id.tv_total_price);
delete=(TextView)findViewById(R.id.tv_delete);
tv_go_to_pay=(TextView)findViewById(R.id.tv_go_to_pay);
all_chekbox.setOnClickListener(this);
delete.setOnClickListener(this);
tv_go_to_pay.setOnClickListener(this);
initDate();
adapter=newCaetAdapter(MainActivity.this,listmap);
listview.setAdapter(adapter);
adapter.setRefreshPriceInterface(this);
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.all_chekbox:
AllTheSelected();
break;
caseR.id.tv_delete:
checkDelete(adapter.getPitchOnMap());
break;
caseR.id.tv_go_to_pay:
if(totalCount<=0){
Toast.makeText(this,"请选择要付款的商品~",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"付款成功",Toast.LENGTH_SHORT).show();
}
break;
}
}
/**
*数据
*/
privatevoidinitDate(){
//创建集合
goodsList=newArrayList<>();
//数据库
userDao=Myapplication.getInstances().getDaoSession().getUserDao();
userDao.deleteAll();
//数据源
for(inti=0;i<10;i++){
//向数据库存放数据
Useruser=newUser((long)i,
"购物车里的第"+(i+1)+"件商品",
(i+20)+"码",
"10",
"10");
userDao.insert(user);
}
//从数据库中把数据放到集合中
goodsList=userDao.loadAll();
//把结合中的数据放到HashMap集合中
for(inti=0;i<goodsList.size();i++){
HashMap<String,String>map=newHashMap<>();
map.put("id",goodsList.get(i).getId()+"");
map.put("name",goodsList.get(i).getName());
map.put("type",(goodsList.get(i).getType()));
map.put("price",goodsList.get(i).getPrice()+"");
map.put("count",goodsList.get(i).getCount()+"");
listmap.add(map);
}
}
@Override
publicvoidrefreshPrice(HashMap<String,Integer>pitchOnMap){
priceControl(pitchOnMap);
}
/**
*控制价格展示总价
*/
privatevoidpriceControl(Map<String,Integer>pitchOnMap){
totalCount=0;
totalPrice=0.00;
for(inti=0;i<listmap.size();i++){
if(pitchOnMap.get(listmap.get(i).get("id"))==1){
totalCount=totalCount+Integer.valueOf(listmap.get(i).get("count"));
doublegoodsPrice=Integer.valueOf(listmap.get(i).get("count"))*Double.valueOf(listmap.get(i).get("price"));
totalPrice=totalPrice+goodsPrice;
}
}
price.setText("¥"+totalPrice);
tv_go_to_pay.setText("付款("+totalCount+")");
}
/**
*删除控制价格展示总价
*@parammap
*/
privatevoidcheckDelete(Map<String,Integer>map){
List<HashMap<String,String>>waitDeleteList=newArrayList<>();
Map<String,Integer>waitDeleteMap=newHashMap<>();
for(inti=0;i<listmap.size();i++){
if(map.get(listmap.get(i).get("id"))==1){
waitDeleteList.add(listmap.get(i));
waitDeleteMap.put(listmap.get(i).get("id"),map.get(listmap.get(i).get("id")));
}
}
listmap.removeAll(waitDeleteList);
map.remove(waitDeleteMap);
priceControl(map);
adapter.notifyDataSetChanged();
}
/**
*全选或反选
*/
privatevoidAllTheSelected(){
HashMap<String,Integer>map=adapter.getPitchOnMap();
booleanisCheck=false;
booleanisUnCheck=false;
Iteratoriter=map.entrySet().iterator();
while(iter.hasNext()){
Map.Entryentry=(Map.Entry)iter.next();
if(Integer.valueOf(entry.getValue().toString())==1){
isCheck=true;
}else{
isUnCheck=true;
}
}
if(isCheck==true&&isUnCheck==false){//已经全选,做反选
for(inti=0;i<listmap.size();i++){
map.put(listmap.get(i).get("id"),0);
}
all_chekbox.setChecked(false);
}elseif(isCheck==true&&isUnCheck==true){//部分选择,做全选
for(inti=0;i<listmap.size();i++){
map.put(listmap.get(i).get("id"),1);
}
all_chekbox.setChecked(true);
}elseif(isCheck==false&&isUnCheck==true){//一个没选,做全选
for(inti=0;i<listmap.size();i++){
map.put(listmap.get(i).get("id"),1);
}
all_chekbox.setChecked(true);
}
priceControl(map);
adapter.setPitchOnMap(map);
adapter.notifyDataSetChanged();
}
}
以上就是扣丁学堂Android培训之Android Studio实现简单购物车功能及源码的详细介绍,希望本文的内容对学习Android开发费有深入的了解,如果你想学习更多的Android知识,对Android有全面的了解,请关注扣丁学堂微信公众号,或登录扣丁学堂官网了解更多,还有大量Android视频教程等着你来观看。