Android Studio按钮点击时向Cart Activity传递数据问题
解决Android Studio购物车数据传递与持久化问题
刚接触Android开发遇到这种问题很正常,咱们一步步来搞定它——既要实现点击按钮传递商品数据到Cart页面,还要能保存多件商品不会丢失。
第一步:用Parcelable封装商品数据
直接传零散的字符串、图片ID太麻烦,咱们先定义一个Product实体类,把商品名称、价格、图片信息都封装进去,同时实现Parcelable接口(Android用来跨页面传递对象的标准方式):
import android.os.Parcel; import android.os.Parcelable; public class Product implements Parcelable { private String name; private String price; private int imageResId; // 存应用内图片资源ID,网络图的话换成String存URL // 构造方法 public Product(String name, String price, int imageResId) { this.name = name; this.price = price; this.imageResId = imageResId; } // Parcelable序列化/反序列化方法,Android Studio可以自动生成(右键→Generate→Parcelable) protected Product(Parcel in) { name = in.readString(); price = in.readString(); imageResId = in.readInt(); } public static final Creator<Product> CREATOR = new Creator<Product>() { @Override public Product createFromParcel(Parcel in) { return new Product(in); } @Override public Product[] newArray(int size) { return new Product[size]; } }; // Getter方法,供后续页面获取数据 public String getName() { return name; } public String getPrice() { return price; } public int getImageResId() { return imageResId; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(price); dest.writeInt(imageResId); } }
第二步:按钮点击时传递商品数据
修改你原有的按钮点击代码,获取TextView里的内容和图片资源,封装成Product对象后通过Intent传递:
Button button = findViewById(R.id.addcart); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取商品名称、价格 String productName = ((TextView) findViewById(R.id.textView6)).getText().toString(); String productPrice = ((TextView) findViewById(R.id.textView7)).getText().toString(); // 获取商品图片资源ID(假设图片在ImageView中,ID为product_image) int productImage = ((ImageView) findViewById(R.id.product_image)).getDrawable().getConstantState().getResourceId(); // 创建商品对象 Product newProduct = new Product(productName, productPrice, productImage); // 跳转并传递数据 Intent intent = new Intent(当前Activity.this, CartActivity.class); intent.putExtra("NEW_PRODUCT", newProduct); startActivity(intent); } });
第三步:Cart页面接收并保存商品数据
之前你只能传单次数据,是因为没做持久化存储。咱们用SharedPreferences结合Gson来保存购物车列表(新手友好,不用复杂数据库):
- 先在
build.gradle(Module)里添加Gson依赖:
dependencies { // 其他依赖... implementation 'com.google.code.gson:gson:2.10.1' }
- CartActivity的核心代码:
import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; public class CartActivity extends AppCompatActivity { private ArrayList<Product> cartList; private SharedPreferences sp; private Gson gson = new Gson(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cart); // 初始化SharedPreferences,用来持久化保存购物车数据 sp = getSharedPreferences("CartData", MODE_PRIVATE); // 读取已保存的购物车列表 loadCartData(); // 接收新传递过来的商品 Product newProduct = getIntent().getParcelableExtra("NEW_PRODUCT"); if (newProduct != null) { cartList.add(newProduct); // 保存更新后的购物车 saveCartData(); } // 这里可以用RecyclerView/ListView展示cartList里的商品 // 比如给RecyclerView设置适配器,把cartList传进去即可 } // 读取已保存的购物车数据 private void loadCartData() { String cartJson = sp.getString("cart_list", ""); if (!cartJson.isEmpty()) { Type type = new TypeToken<ArrayList<Product>>() {}.getType(); cartList = gson.fromJson(cartJson, type); } else { cartList = new ArrayList<>(); } } // 保存购物车数据到SharedPreferences private void saveCartData() { String cartJson = gson.toJson(cartList); SharedPreferences.Editor editor = sp.edit(); editor.putString("cart_list", cartJson); editor.apply(); } }
补充说明
- 如果是网络图片:把
Product里的imageResId换成imageUrl(String类型),传递后在Cart页面用Glide/Picasso加载即可。 - 进阶方案:如果后续购物车逻辑复杂(比如修改数量、删除商品),建议换成Room数据库,比SharedPreferences更适合处理结构化数据。
内容的提问来源于stack exchange,提问作者Tanner Tattini
相关产品推荐
相关产品推荐

