首页 > 解决方案 > 对象在作为 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,即使它是通过有效值传递的。

为什么会这样?某些东西必须与包裹的东西有关。

标签: androidandroid-intentparcel

解决方案


我得到了答案,而且很简单——

https://github.com/mcharmas/android-parcelable-intellij-plugin/blob/master/README.md

您应该将 Parcelable 插件下载到您的 IDE 中并让它为您执行 - 如果您有复杂的字段,例如地图或列表,则适用。它可以工作,不像 IDE 中的自动生成包裹实现。


推荐阅读