Android实现简单购物车功能
更新时间:2021年04月22日 15:47:28 作者:jie哈哈哈
这篇文章主要为大家详细介绍了Android实现二级列表购物车功能
,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Android实现购物车功能的具体代码,供大家参考,具体内容如下
MainActivity布局:
<?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: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:button="@drawable/check_box_bg" 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:textColor="@color/purple" 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:background="@color/orange" android:clickable="true" 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>
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.CheckBox; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; public class MainActivity extends AppCompatActivity implements CartAdapter.RefreshPriceInterface ,View.OnClickListener{ private ListView listView; private CheckBox cb_check_all; private TextView tv_total_price; private TextView tv_delete; private TextView tv_go_to_pay; private CartAdapter adapter; private double totalPrice = 0.00; private int totalCount = 0; private List<HashMap<String,String>> goodsList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initDate(); } //控制价格展示 private void priceControl(Map<String, Integer> pitchOnMap){ totalCount = 0; totalPrice = 0.00; for(int i=0;i<goodsList.size();i++){ if(pitchOnMap.get(goodsList.get(i).get("id"))==1){ totalCount=totalCount+Integer.valueOf(goodsList.get(i).get("count")); double goodsPrice=Integer.valueOf(goodsList.get(i).get("count"))*Double.valueOf(goodsList.get(i).get("price")); totalPrice=totalPrice+goodsPrice; } } tv_total_price.setText("¥ "+totalPrice); tv_go_to_pay.setText("付款("+totalCount+")"); } @Override public void refreshPrice(Map<String, Integer> pitchOnMap) { priceControl(pitchOnMap); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.all_chekbox: AllTheSelected(); break; case R.id.tv_go_to_pay: if(totalCount<=0){ Toast.makeText(this,"请选择要付款的商品~",Toast.LENGTH_SHORT).show(); return; } Toast.makeText(this,"钱就是另一回事了~",Toast.LENGTH_SHORT).show(); break; case R.id.tv_delete: if(totalCount<=0){ Toast.makeText(this,"请选择要删除的商品~",Toast.LENGTH_SHORT).show(); return; } checkDelete(adapter.getPitchOnMap()); break; } } //删除操作 private void checkDelete(Map<String,Integer> map){ List<HashMap<String,String>> waitDeleteList=new ArrayList<>(); Map<String,Integer> waitDeleteMap =new HashMap<>(); for(int i=0;i<goodsList.size();i++){ if(map.get(goodsList.get(i).get("id"))==1){ waitDeleteList.add(goodsList.get(i)); waitDeleteMap.put(goodsList.get(i).get("id"),map.get(goodsList.get(i).get("id"))); } } goodsList.removeAll(waitDeleteList); map.remove(waitDeleteMap); priceControl(map); adapter.notifyDataSetChanged(); } //全选或反选 private void AllTheSelected(){ Map<String,Integer> map=adapter.getPitchOnMap(); boolean isCheck=false; boolean isUnCheck=false; Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); if(Integer.valueOf(entry.getValue().toString())==1)isCheck=true; else isUnCheck=true; } if(isCheck==true&&isUnCheck==false){//已经全选,做反选 for(int i=0;i<goodsList.size();i++){ map.put(goodsList.get(i).get("id"),0); } cb_check_all.setChecked(false); }else if(isCheck==true && isUnCheck==true){//部分选择,做全选 for(int i=0;i<goodsList.size();i++){ map.put(goodsList.get(i).get("id"),1); } cb_check_all.setChecked(true); }else if(isCheck==false && isUnCheck==true){//一个没选,做全选 for(int i=0;i<goodsList.size();i++){ map.put(goodsList.get(i).get("id"),1); } cb_check_all.setChecked(true); } priceControl(map); adapter.setPitchOnMap(map); adapter.notifyDataSetChanged(); } private void initView(){ listView = (ListView) findViewById(R.id.listview); cb_check_all = (CheckBox) findViewById(R.id.all_chekbox); tv_total_price = (TextView) findViewById(R.id.tv_total_price); tv_delete = (TextView) findViewById(R.id.tv_delete); tv_go_to_pay = (TextView) findViewById(R.id.tv_go_to_pay); tv_go_to_pay.setOnClickListener(this); tv_delete.setOnClickListener(this); cb_check_all.setOnClickListener(this); adapter=new CartAdapter(this,goodsList); adapter.setRefreshPriceInterface(this); listView.setAdapter(adapter); adapter.notifyDataSetChanged(); } private void initDate(){ goodsList=new ArrayList<>(); for(int i=0;i<10;i++){ HashMap<String,String> map=new HashMap<>(); map.put("id",(new Random().nextInt(10000)%(10000-2900+2900) + 2900)+""); map.put("name","购物车里的第"+(i+1)+"件商品"); map.put("type",(i+20)+"码"); map.put("price",(new Random().nextInt(100)%(100-29+29) + 29)+""); map.put("count",(new Random().nextInt(10)%(10-1+1) + 1)+""); goodsList.add(map); } initView(); } }
CartAdapter布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" 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:background="@color/page_backgroup" 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:button="@drawable/check_box_bg" 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/good_icon" /> <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:textColor="@color/grey_color1" 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:textColor="@color/orange_color" android:textSize="14sp" android:textStyle="bold" /> <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:textColor="@color/grey_color3" 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:background="@drawable/text_angle_gray" android:gravity="center" android:text="一" android:textColor="@color/grey_color1" android:textSize="12sp" /> <TextView android:id="@+id/tv_num" android:layout_width="25dp" android:layout_height="25dp" android:background="@drawable/text_angle" android:gravity="center" android:singleLine="true" android:text="1" android:textColor="@color/grey_color1" android:textSize="12sp" /> <TextView android:id="@+id/tv_add" android:layout_width="25dp" android:layout_height="25dp" android:background="@drawable/text_angle_right" android:gravity="center" android:text="+" android:textColor="@color/grey_color1" android:textSize="12sp" /> </LinearLayout> </RelativeLayout> </RelativeLayout> </LinearLayout> </LinearLayout>
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by lipeng * 2017/6/5. */ public class CartAdapter extends BaseAdapter { private Context context; private List<HashMap<String,String>> dataList; private ViewHolder vh; private Map<String,Integer> pitchOnMap; private RefreshPriceInterface refreshPriceInterface; public CartAdapter(Context context, List<HashMap<String,String>> list){ this.context=context; this.dataList=list; pitchOnMap=new HashMap<>(); for(int i=0;i<dataList.size();i++){ pitchOnMap.put(dataList.get(i).get("id"),0); } } @Override public View getView(final int position, View view, ViewGroup viewGroup) { vh=new ViewHolder(); if(view==null){ view= LayoutInflater.from(context).inflate(R.layout.item_layout,null); vh.checkBox=(CheckBox)view.findViewById(R.id.check_box); vh.icon=(ImageView)view.findViewById(R.id.iv_adapter_list_pic); vh.name=(TextView)view.findViewById(R.id.tv_goods_name); vh.price=(TextView)view.findViewById(R.id.tv_goods_price); vh.type=(TextView)view.findViewById(R.id.tv_type_size); vh.num=(TextView)view.findViewById(R.id.tv_num); vh.reduce=(TextView)view.findViewById(R.id.tv_reduce); vh.add=(TextView)view.findViewById(R.id.tv_add); view.setTag(vh); }else { vh=(ViewHolder)view.getTag(); } if(dataList.size()>0){ if(pitchOnMap.get(dataList.get(position).get("id"))==0)vh.checkBox.setChecked(false); else vh.checkBox.setChecked(true); HashMap<String,String> map=dataList.get(position); vh.name.setText(map.get("name")); vh.num.setText(map.get("count")); vh.type.setText(map.get("type")); vh.price.setText("¥ "+(Double.valueOf(map.get("price")) * Integer.valueOf(map.get("count")))); vh.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final int index=position; if(((CheckBox)view).isChecked())pitchOnMap.put(dataList.get(index).get("id"),1);else pitchOnMap.put(dataList.get(index).get("id"),0); refreshPriceInterface.refreshPrice(pitchOnMap); } }); vh.reduce.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final int index=position; dataList.get(index).put("count",(Integer.valueOf(dataList.get(index).get("count"))-1)+""); if(Integer.valueOf(dataList.get(index).get("count"))<=0){ //可提示是否删除该商品,确定就remove,否则就保留1 String deID=dataList.get(index).get("id"); dataList.remove(index); pitchOnMap.remove(deID); } notifyDataSetChanged(); refreshPriceInterface.refreshPrice(pitchOnMap); } }); vh.add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final int index=position; dataList.get(index).put("count",(Integer.valueOf(dataList.get(index).get("count"))+1)+""); if(Integer.valueOf(dataList.get(index).get("count"))>15){ //15为库存可选择上限 Toast.makeText(context,"已达库存上限~",Toast.LENGTH_SHORT).show(); return; } notifyDataSetChanged(); refreshPriceInterface.refreshPrice(pitchOnMap); } }); } return view; } public Map<String,Integer> getPitchOnMap(){ return pitchOnMap; } public void setPitchOnMap(Map<String,Integer> pitchOnMap){ this.pitchOnMap=new HashMap<>(); this.pitchOnMap.putAll(pitchOnMap); } public interface RefreshPriceInterface{ void refreshPrice(Map<String, Integer> pitchOnMap); } public void setRefreshPriceInterface(RefreshPriceInterface refreshPriceInterface){ this.refreshPriceInterface=refreshPriceInterface; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public int getCount() { if (dataList != null) { return dataList.size(); } else { return 0; } } class ViewHolder{ CheckBox checkBox; ImageView icon; TextView name,price,num,type,reduce,add; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
详谈Android动画效果translate、scale、alpha、rotate
下面小编就为大家带来一篇详谈Android动画效果translate、scale、alpha、rotate。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-01-01基于Android 监听ContentProvider 中数据变化的相关介绍
本篇文章小编为大家介绍,基于Android 监听ContentProvider 中数据变化的相关介绍。需要的朋友参考下2013-04-04详解Android使用Html.fromHtml需要注意的地方
本篇文章主要介绍了详解Android使用Html.fromHtml需要注意的地方,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07解决genymotion模拟器无法联网的正确方法100%成功
android 5.1版不能联网,三个步骤的设置就可以解决你的genymotion模拟器无法联网的问题2018-03-03
最新评论