扣丁学堂解析Android Studio实现简单购物车功能及源码

今天扣丁学堂Android培训给大家分享了Android Studio实现简单购物车功能及源码,下面我们一起来看一下吧。

扣丁学堂解析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视频教程等着你来观看。

相关推荐