Android Studio实现简单购物车功能
作者:攀岩嘉
这篇文章主要为大家详细介绍了Android Studio实现简单购物车,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Android Studio实现简单购物车的具体代码,供大家参考,具体内容如下
MainActivity的布局文件
<LinearLayout xmlns: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>
条目的布局文件
<LinearLayout xmlns: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适配器
public class CaetAdapter extends BaseAdapter { private Context context; private List<HashMap<String, String>> list; private HashMap<String, Integer> pitchOnMap; public HashMap<String, Integer> getPitchOnMap() { return pitchOnMap; } public void setPitchOnMap(HashMap<String, Integer> pitchOnMap) { this.pitchOnMap = pitchOnMap; } public CaetAdapter(Context context, List<HashMap<String, String>> list) { this.context = context; this.list = list; pitchOnMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { pitchOnMap.put(list.get(i).get("id"), 0); } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { convertView = View.inflate(context, R.layout.item_layout, null); final CheckBox checkBox; ImageView icon; final TextView name, 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(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 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(new View.OnClickListener() { @Override public void onClick(View v) { 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(new View.OnClickListener() { @Override public void onClick(View v) { list.get(position).put("count", (Integer.valueOf(list.get(position).get("count")) + 1) + ""); notifyDataSetChanged(); mrefreshPriceInterface.refreshPrice(pitchOnMap); } }); return convertView; } /** * 创建接口 */ public interface RefreshPriceInterface { /** * 把价格展示到总价上 * @param pitchOnMap */ void refreshPrice(HashMap<String, Integer> pitchOnMap); } /** * 定义一个接口对象 */ private RefreshPriceInterface mrefreshPriceInterface; /** * 向外部暴露一个方法 * 把价格展示到总价上 * @param refreshPriceInterface */ public void setRefreshPriceInterface(RefreshPriceInterface refreshPriceInterface) { mrefreshPriceInterface = refreshPriceInterface; } }
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener,CaetAdapter.RefreshPriceInterface{ private LinearLayout top_bar; private ListView listview; private CheckBox all_chekbox; private TextView price; private TextView delete; private TextView tv_go_to_pay; private List<User> goodsList; private UserDao userDao; private List<HashMap<String,String>> listmap=new ArrayList<>(); private CaetAdapter adapter; private double totalPrice = 0.00; private int totalCount = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { 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 = new CaetAdapter(MainActivity.this, listmap); listview.setAdapter(adapter); adapter.setRefreshPriceInterface(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.all_chekbox: AllTheSelected(); break; case R.id.tv_delete: checkDelete(adapter.getPitchOnMap()); break; case R.id.tv_go_to_pay: if(totalCount<=0){ Toast.makeText(this,"请选择要付款的商品~",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"付款成功",Toast.LENGTH_SHORT).show(); } break; } } /** * 数据 */ private void initDate() { //创建集合 goodsList = new ArrayList<>(); //数据库 userDao = Myapplication.getInstances().getDaoSession().getUserDao(); userDao.deleteAll(); //数据源 for (int i = 0; i < 10; i++) { //向数据库存放数据 User user = new User((long) i, "购物车里的第" + (i + 1) + "件商品", (i + 20) + "码", "10", "10"); userDao.insert(user); } //从数据库中把数据放到集合中 goodsList=userDao.loadAll(); //把结合中的数据放到HashMap集合中 for(int i=0;i<goodsList.size();i++){ HashMap<String,String> map=new HashMap<>(); 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 public void refreshPrice(HashMap<String, Integer> pitchOnMap) { priceControl(pitchOnMap); } /** * 控制价格展示总价 */ private void priceControl(Map<String, Integer> pitchOnMap){ totalCount = 0; totalPrice = 0.00; for(int i=0;i<listmap.size();i++){ if(pitchOnMap.get(listmap.get(i).get("id"))==1){ totalCount=totalCount+Integer.valueOf(listmap.get(i).get("count")); double goodsPrice=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+")"); } /** * 删除 控制价格展示总价 * @param map */ 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<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(); } /** *全选或反选 */ private void AllTheSelected(){ HashMap<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<listmap.size();i++){ map.put(listmap.get(i).get("id"),0); } all_chekbox.setChecked(false); }else if(isCheck==true && isUnCheck==true){//部分选择,做全选 for(int i=0;i<listmap.size();i++){ map.put(listmap.get(i).get("id"),1); } all_chekbox.setChecked(true); }else if(isCheck==false && isUnCheck==true){//一个没选,做全选 for(int i=0;i<listmap.size();i++){ map.put(listmap.get(i).get("id"),1); } all_chekbox.setChecked(true); } priceControl(map); adapter.setPitchOnMap(map); adapter.notifyDataSetChanged(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。