android - 对象在作为 Parcelable 对象传递后为空
问题描述
我有以下点击监听器,它将模型数据放入意图并传递它 -
@Override
public void onBindViewHolder(@NonNull ProductHolder productHolder, int i) {
MiniProductModel model = miniProductModelList.get(i);
//setting text and images
Picasso.get().load(model.getProductsIndividualField().getImageUrl()).into(productHolder.productImageview);
productHolder.productTitle.setText(model.getProductParentFields().getProductName());
productHolder.productVendor.setText(model.getProductParentFields().getVendorName());
productHolder.productPrice.setText(context.getString(R.string.dollar_sign).concat(String.format(Locale.US, "%.2f", model.getProductsIndividualField().getPrice())));
productHolder.productsLikes.setText(String.valueOf(model.getProductParentFields().getLikes()));
//setting listeners
productHolder.productVendor.setOnClickListener(view -> {
if (context instanceof VendorPageActivity)
return;
try {
Intent intent = new Intent(context, VendorPageActivity.class);
intent.putExtra(EXTRA_PRODUCT_MODEL, model);
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, getString(R.string.marketplace_vendor_unavailable), Toast.LENGTH_SHORT).show();
}
});
productHolder.productImageview.setOnClickListener(view -> {
try {
Intent intent = new Intent(context, ProductPageActivity.class);
intent.putExtra(EXTRA_PRODUCT_MODEL, model);
view.getContext().startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, getString(R.string.marketplace_product_unavailable), Toast.LENGTH_SHORT).show();
}
});
}
在我的 ProductPageActivity 上,我通过以下方式得到它 -
@Override
public void initProductData() {
Parcelable parcelableExtra = getIntent().getParcelableExtra(EXTRA_PRODUCT_MODEL);
if (parcelableExtra != null) {
selectedProduct = (MiniProductModel) parcelableExtra;
}
try {
productImagesList = selectedProduct.getProductsIndividualField().getPictureList();
mPresenter.initViewPager();
String productName = selectedProduct.getProductParentFields().getProductName();
productsTitle.setText(productName);
productsShortDescription.setText(selectedProduct.getProductParentFields().getShortDescription());
vendorsName.setText(selectedProduct.getProductParentFields().getVendorName().concat(","));
currentVendorPath.setText(" ".concat(selectedProduct.getProductParentFields().getVendorName().concat(" /")));
currentProductPath.setText(" ".concat(productName));
fulfilledBy.setText(getString(R.string.product_page_activity_project_verte)); //TODO - when server updates fulfilled & sold by, update this Textview accordingly.
priceTextview.setText(getString(R.string.dollar_sign).concat(String.format(Locale.US, "%.2f", selectedProduct.getProductsIndividualField().getPrice())));
skuTextview.setText(getString(R.string.product_page_activity_sku).concat(" ").concat(selectedProduct.getProductsIndividualField().getSku()));
Picasso.get().load(selectedProduct.getProductParentFields().getVendorImageUrl()).into(vendorIconImage);
//productName
mPresenter.setProductAvailability(selectedProduct.getProductsIndividualField().getStockQuantity());
mPresenter.getRelatedProducts();
} catch (Exception e) {
e.printStackTrace();
}
}
这是我的模型-
public class MiniProductModel implements Parcelable {
private ProductParentFields productParentFields;
private ProductsIndividualField productsIndividualField;
public MiniProductModel(ProductParentFields productParentFields, ProductsIndividualField productsIndividualField) {
this.productParentFields = productParentFields;
this.productsIndividualField = productsIndividualField;
}
protected MiniProductModel(Parcel in) {
productParentFields = in.readParcelable(ProductParentFields.class.getClassLoader());
productsIndividualField = in.readParcelable(ProductsIndividualField.class.getClassLoader());
}
public static final Creator<MiniProductModel> CREATOR = new Creator<MiniProductModel>() {
@Override
public MiniProductModel createFromParcel(Parcel in) {
return new MiniProductModel(in);
}
@Override
public MiniProductModel[] newArray(int size) {
return new MiniProductModel[size];
}
};
public ProductParentFields getProductParentFields() {
return productParentFields;
}
public void setProductParentFields(ProductParentFields productParentFields) {
this.productParentFields = productParentFields;
}
public ProductsIndividualField getProductsIndividualField() {
return productsIndividualField;
}
public void setProductsIndividualField(ProductsIndividualField productsIndividualField) {
this.productsIndividualField = productsIndividualField;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(productParentFields, flags);
dest.writeParcelable(productsIndividualField, flags);
}
}
public class ProductsIndividualField implements Parcelable {
private String productId;
private String imageUrl;
private String sku;
private String vendorImageUrl;
private int stockQuantity;
private double price;
private List<String> pictureList;
private Map<String, List<String>> allAttributesMap;
private Map<String, String> specificAttributeMap;
public ProductsIndividualField(String productId, String imageUrl, String sku, String vendorImageUrl, int stockQuantity, double price, List<String> pictureList, Map<String, List<String>> allAttributesMap, Map<String, String> specificAttributeMap) {
this.productId = productId;
this.imageUrl = imageUrl;
this.sku = sku;
this.vendorImageUrl = vendorImageUrl;
this.stockQuantity = stockQuantity;
this.price = price;
this.pictureList = pictureList;
this.allAttributesMap = allAttributesMap;
this.specificAttributeMap = specificAttributeMap;
}
protected ProductsIndividualField(Parcel in) {
productId = in.readString();
imageUrl = in.readString();
sku = in.readString();
vendorImageUrl = in.readString();
stockQuantity = in.readInt();
price = in.readDouble();
pictureList = in.createStringArrayList();
specificAttributeMap = new HashMap<>();
in.readMap(specificAttributeMap, Map.class.getClassLoader());
allAttributesMap = new HashMap<>();
in.readMap(allAttributesMap, Map.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(productId);
dest.writeString(imageUrl);
dest.writeString(sku);
dest.writeString(vendorImageUrl);
dest.writeInt(stockQuantity);
dest.writeDouble(price);
dest.writeStringList(pictureList);
dest.writeMap(specificAttributeMap);
dest.writeMap(allAttributesMap);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<ProductsIndividualField> CREATOR = new Creator<ProductsIndividualField>() {
@Override
public ProductsIndividualField createFromParcel(Parcel in) {
return new ProductsIndividualField(in);
}
@Override
public ProductsIndividualField[] newArray(int size) {
return new ProductsIndividualField[size];
}
};
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getSku() {
return sku;
}
public void setSku(String sku) {
this.sku = sku;
}
public String getVendorImageUrl() {
return vendorImageUrl;
}
public void setVendorImageUrl(String vendorImageUrl) {
this.vendorImageUrl = vendorImageUrl;
}
public int getStockQuantity() {
return stockQuantity;
}
public void setStockQuantity(int stockQuantity) {
this.stockQuantity = stockQuantity;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public List<String> getPictureList() {
return pictureList;
}
public void setPictureList(List<String> pictureList) {
this.pictureList = pictureList;
}
public Map<String, List<String>> getAllAttributesMap() {
return allAttributesMap;
}
public void setAllAttributesMap(Map<String, List<String>> allAttributesMap) {
this.allAttributesMap = allAttributesMap;
}
public Map<String, String> getSpecificAttributeMap() {
return specificAttributeMap;
}
public void setSpecificAttributeMap(Map<String, String> specificAttributeMap) {
this.specificAttributeMap = specificAttributeMap;
}
}
public class ProductParentFields implements Parcelable {
private String productName;
private String shortDescription;
private String fullDescription;
private String vendorName;
private String vendorURL;
private String productURL;
private String vendorImageUrl;
private String parentVerteItemID;
private int likes;
public ProductParentFields(String productName, String shortDescription, String fullDescription, String vendorName, String vendorURL, String productURL, String vendorImageUrl, String parentVerteItemID, int likes) {
this.productName = productName;
this.shortDescription = shortDescription;
this.fullDescription = fullDescription;
this.vendorName = vendorName;
this.vendorURL = vendorURL;
this.productURL = productURL;
this.vendorImageUrl = vendorImageUrl;
this.parentVerteItemID = parentVerteItemID;
this.likes = likes;
}
protected ProductParentFields(Parcel in) {
productName = in.readString();
shortDescription = in.readString();
fullDescription = in.readString();
vendorName = in.readString();
vendorURL = in.readString();
productURL = in.readString();
vendorImageUrl = in.readString();
parentVerteItemID = in.readString();
likes = in.readInt();
}
public static final Creator<ProductParentFields> CREATOR = new Creator<ProductParentFields>() {
@Override
public ProductParentFields createFromParcel(Parcel in) {
return new ProductParentFields(in);
}
@Override
public ProductParentFields[] newArray(int size) {
return new ProductParentFields[size];
}
};
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getShortDescription() {
return shortDescription;
}
public void setShortDescription(String shortDescription) {
this.shortDescription = shortDescription;
}
public String getFullDescription() {
return fullDescription;
}
public void setFullDescription(String fullDescription) {
this.fullDescription = fullDescription;
}
public String getVendorName() {
return vendorName;
}
public void setVendorName(String vendorName) {
this.vendorName = vendorName;
}
public String getVendorURL() {
return vendorURL;
}
public void setVendorURL(String vendorURL) {
this.vendorURL = vendorURL;
}
public String getProductURL() {
return productURL;
}
public void setProductURL(String productURL) {
this.productURL = productURL;
}
public String getVendorImageUrl() {
return vendorImageUrl;
}
public void setVendorImageUrl(String vendorImageUrl) {
this.vendorImageUrl = vendorImageUrl;
}
public int getLikes() {
return likes;
}
public void setLikes(int likes) {
this.likes = likes;
}
public String getParentVerteItemID() {
return parentVerteItemID;
}
public void setParentVerteItemID(String parentVerteItemID) {
this.parentVerteItemID = parentVerteItemID;
}
@Override
public String toString() {
return "ProductParentFields{" +
"productName='" + productName + '\'' +
", shortDescription='" + shortDescription + '\'' +
", fullDescription='" + fullDescription + '\'' +
", vendorName='" + vendorName + '\'' +
", vendorURL='" + vendorURL + '\'' +
", productURL='" + productURL + '\'' +
", vendorImageUrl='" + vendorImageUrl + '\'' +
", parentVerteItemID='" + parentVerteItemID + '\'' +
", likes=" + likes +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(productName);
dest.writeString(shortDescription);
dest.writeString(fullDescription);
dest.writeString(vendorName);
dest.writeString(vendorURL);
dest.writeString(productURL);
dest.writeString(vendorImageUrl);
dest.writeInt(likes);
dest.writeString(parentVerteItemID);
}
}
我面临的问题是,当在 处检索我的模型时ProductPageActivity
,我得到getProductsIndividualField
了 null,即使它是通过有效值传递的。
为什么会这样?某些东西必须与包裹的东西有关。
解决方案
我得到了答案,而且很简单——
https://github.com/mcharmas/android-parcelable-intellij-plugin/blob/master/README.md
您应该将 Parcelable 插件下载到您的 IDE 中并让它为您执行 - 如果您有复杂的字段,例如地图或列表,则适用。它可以工作,不像 IDE 中的自动生成包裹实现。
推荐阅读
- python - 有没有什么方法可以读取和修改 .ini 文件的内容仅在 azure blob 存储中,而无需使用 python 在本地下载?
- excel - Excel /使用powershell复制将2列粘贴到一列
- c# - 业务模型对象上的 DataGridViewAutoFilter
- python - 如何组合多个 NumPy 布尔数组?
- python - 我不能在一个 tkinter 窗口中使用两个框架
- react-native - 关闭 IOS 应用程序后的 react-native WebView 会话
- grails - Grails 如何将 camelCase 转换为更人性化的标题以显示给用户?
- python-3.x - Elasticsearch使用批量api python索引多个csv
- unsupervised-learning - Imagenet 是否包含未标记的数据?
- javascript - 如何自动检查两个单选按钮组的单选按钮基础