You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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;
    }
}

几个注意点

  1. 确保Users类的空构造函数存在,Firebase反序列化数据必须用到它;
  2. 当前用静态列表保存购物车数据,App重启后会丢失,后续可以用SharedPreferences或Room数据库做持久化;
  3. 测试时多添加几个商品,看看购物车是否能正常展示所有商品和计算总价。

内容的提问来源于stack exchange,提问作者Alex97

火山引擎 最新活动