Android跨Activity实现商品添加至购物车RecyclerView并展示问题
嘿,很高兴帮你搞定这个购物车功能的问题!作为Android新手,第一次做这类功能确实容易摸不着头脑,咱们一步步来梳理和修改代码,让购物车能正常展示商品~
一、先解决数据传递和持久化的问题
你现在每次点击「添加到购物车」只传递单个商品,而且购物车没有保留之前的商品,首先得让你的Users类支持序列化,这样才能传递整个商品列表:
// 修改你的Users类,实现Serializable接口 public class Users implements Serializable { // 保留你原有的字段:name、surname、price等 // 必须保留空构造函数(Firebase反序列化需要) public Users() {} // 带参数的构造函数 public Users(String name, String surname, Long price) { this.name = name; this.surname = surname; this.price = price; } // 保留原有的getter和setter方法 }
然后修改FirebaseSearch中ViewHolder的点击事件,把选中的商品添加到全局列表,再传递整个列表到购物车:
// 在FirebaseSearch的UsersViewHolder内部的点击事件里 addToCart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建当前选中的商品对象 Users selectedGoods = new Users(nome, surname, prezzo); // 添加到全局购物车列表 arrayList.add(selectedGoods); // 更新购物车数量 cart_count = arrayList.size(); Context context = v.getContext(); Intent intent = new Intent(context, CartActivity.class); // 传递整个购物车列表 intent.putExtra("cartItems", arrayList); context.startActivity(intent); Toast.makeText(context, "商品已添加到购物车", Toast.LENGTH_SHORT).show(); } });
二、创建购物车专属的RecyclerView Adapter
你需要给CartActivity写一个专属的Adapter来渲染购物车商品,新建CartAdapter类:
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.CartViewHolder> { private ArrayList<Users> cartItems; private Context context; public CartAdapter(Context context, ArrayList<Users> cartItems) { this.context = context; this.cartItems = cartItems; } @NonNull @Override public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 加载购物车商品的布局(需要你自己创建对应的xml) View view = LayoutInflater.from(context).inflate(R.layout.cart_item_layout, parent, false); return new CartViewHolder(view); } @Override public void onBindViewHolder(@NonNull CartViewHolder holder, int position) { Users item = cartItems.get(position); // 给控件赋值 holder.tvName.setText(item.getName()); holder.tvSurname.setText(item.getSurname()); holder.tvPrice.setText(String.valueOf(item.getPrice())); // 可选:添加删除商品的功能 holder.btnRemove.setOnClickListener(v -> { cartItems.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, cartItems.size()); // 更新总价 updateTotalPrice(); }); } @Override public int getItemCount() { return cartItems == null ? 0 : cartItems.size(); } // 更新购物车总价 private void updateTotalPrice() { int total = 0; if (cartItems != null) { for (Users item : cartItems) { total += item.getPrice(); } } CartActivity.grandTotal.setText("总价: " + total); CartActivity.grandTotalplus = total; } // 购物车商品的ViewHolder public class CartViewHolder extends RecyclerView.ViewHolder { TextView tvName, tvSurname, tvPrice; Button btnRemove; public CartViewHolder(@NonNull View itemView) { super(itemView); tvName = itemView.findViewById(R.id.cart_item_name); tvSurname = itemView.findViewById(R.id.cart_item_surname); tvPrice = itemView.findViewById(R.id.cart_item_price); btnRemove = itemView.findViewById(R.id.btn_remove_item); } } }
三、创建购物车商品的布局文件
新建cart_item_layout.xml,用来展示单个购物车商品(可以参考你原有的list_layout,加个删除按钮):
<?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="wrap_content" android:orientation="horizontal" android:padding="16dp" android:gravity="center_vertical"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/cart_item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold"/> <TextView android:id="@+id/cart_item_surname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="#666"/> <TextView android:id="@+id/cart_item_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="#009688" android:layout_marginTop="4dp"/> </LinearLayout> <Button android:id="@+id/btn_remove_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除" android:backgroundTint="#FF5252"/> </LinearLayout>
四、修改CartActivity展示购物车商品
最后修改CartActivity的代码,接收传递的商品列表,设置Adapter并计算总价:
public class CartActivity extends AppCompatActivity { public static TextView grandTotal; public static int grandTotalplus; RecyclerView cartRecyclerView; Button proceedToBook; ArrayList<Users> cartItems; CartAdapter cartAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cart); proceedToBook = findViewById(R.id.buyNow); grandTotal = findViewById(R.id.TotalPrice); cartRecyclerView = findViewById(R.id.cartList); // 获取传递过来的购物车商品列表 if (getIntent().getExtras() != null) { cartItems = (ArrayList<Users>) getIntent().getSerializableExtra("cartItems"); } // 配置RecyclerView cartRecyclerView.setHasFixedSize(true); cartRecyclerView.setLayoutManager(new LinearLayoutManager(this)); cartAdapter = new CartAdapter(this, cartItems); cartRecyclerView.setAdapter(cartAdapter); // 计算初始总价 calculateTotalPrice(); // 结算按钮逻辑 proceedToBook.setOnClickListener(v -> { if (cartItems == null || cartItems.isEmpty()) { Toast.makeText(this, "购物车为空哦", Toast.LENGTH_SHORT).show(); } else { // 这里可以写结算跳转逻辑,比如跳转到支付页面 Toast.makeText(this, "结算总价: " + grandTotalplus, Toast.LENGTH_LONG).show(); } }); } // 计算购物车总价 private void calculateTotalPrice() { if (cartItems == null || cartItems.isEmpty()) { grandTotal.setText("总价: 0"); grandTotalplus = 0; return; } int total = 0; for (Users item : cartItems) { total += item.getPrice(); } grandTotal.setText("总价: " + total); grandTotalplus = total; } }
几个注意点
- 确保
Users类的空构造函数存在,Firebase反序列化数据必须用到它; - 当前用静态列表保存购物车数据,App重启后会丢失,后续可以用SharedPreferences或Room数据库做持久化;
- 测试时多添加几个商品,看看购物车是否能正常展示所有商品和计算总价。
内容的提问来源于stack exchange,提问作者Alex97




