2016-05-18 2 views
1

Я пытаюсь передать класс News в действие, поэтому я внедрил интерфейс Parcelable. Внутри News У меня есть два класса реализации Parcelable тоже, Image и DatereadParcelable returns null

Дело в том, что мой News объект в конце содержит null для полей image и date.

Вот мой код:

News.java

public class News implements Parcelable { 
public static final String TAG = "model_news"; 

private JSONObject object; 

private int id; 
private String type; 
private String title; 
private Boolean comment_disabled; 
private String category_name; 
private String url; 
private Image images; 
private Date date; 
private Boolean is_video; 

public News(JSONObject object) { 
    this.object = object; 

    try { 
     id = Integer.parseInt(object.getString("id")); 
     type = object.getString("type"); 
     title = object.getString("title"); 
     comment_disabled = object.getBoolean("comment_disabled"); 
     category_name = object.getString("category_name"); 
     url = object.getString("url"); 

     if (!object.isNull("images")) { 
      images = new Image(object.getJSONObject("images")); 
     } 

     date = new Date(object.getJSONObject("date")); 

     is_video = object.getBoolean("is_video"); 

    } catch (JSONException e) { 
     Log.e(TAG, e.getMessage()); 
    } 

} 

protected News(Parcel in) { 
    id = in.readInt(); 
    type = in.readString(); 
    title = in.readString(); 
    category_name = in.readString(); 
    url = in.readString(); 
    images = (Image) in.readParcelable(Image.class.getClassLoader()); 
    date = (Date) in.readParcelable(Date.class.getClassLoader()); 
    is_video = in.readByte() != 0; 
    comment_disabled = in.readByte() != 0; 
} 

public static final Creator<News> CREATOR = new Creator<News>() { 
    @Override 
    public News createFromParcel(Parcel in) { 
     return new News(in); 
    } 

    @Override 
    public News[] newArray(int size) { 
     return new News[size]; 
    } 
}; 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(id); 
    dest.writeString(type); 
    dest.writeString(title); 
    dest.writeByte((byte) (comment_disabled ? 1 : 0)); 
    dest.writeString(category_name); 
    dest.writeString(url); 
    dest.writeParcelable(images, flags); 
    dest.writeParcelable(date, flags); 
    dest.writeByte((byte) (is_video ? 1 : 0)); 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

}

Image.java

public class Image implements Parcelable { 
public static final String TAG = "model_image"; 

private JSONObject imageObj; 
private JSONObject original; 

private String source; 
private int width; 
private Drawable image; 

public Image(JSONObject imageObj) { 
    this.imageObj = imageObj; 

    try { 
     original = this.imageObj.getJSONObject("original"); 
     source = original.getString("src"); 
     width = original.getInt("width"); 
    } catch (JSONException e) { 
     e.getMessage(); 
    } 
} 

protected Image(Parcel in) { 
    source = in.readString(); 
    width = in.readInt(); 
} 

public static final Creator<Image> CREATOR = new Creator<Image>() { 
    @Override 
    public Image createFromParcel(Parcel in) { 
     return new Image(in); 
    } 

    @Override 
    public Image[] newArray(int size) { 
     return new Image[size]; 
    } 
}; 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(source); 
    dest.writeInt(width); 
} 

}

что я делаю неправильно?

+0

ни Drawable, ни даты являются parcelable – Blackbelt

+0

'date' не' Util.Date', это персональный класс, реализующий 'parcelable' – Lilrom

+0

как я должен знать, что? – Blackbelt

ответ

2

В реализации Parcelable есть ошибка.

Прежде всего, в результате правильной реализации: поля, переданные в News (Parcel in) Конструктор должен быть записан в той же последовательности в методе writeToParcel(). Это называется Marshalling и Unmarshalling.

Исправления:

  1. Drawable не может быть передан параметр в Parcelable.

  2. Новости Существенная реализация.

Пропустил некоторые поля, только для вашего понимания.

public class News implements Parcelable { 

public static final String TAG = "model_news"; 

    private JSONObject object; 

    private int id; 
    private String type; 
    private String title; 
    private Boolean comment_disabled; 
    private String category_name; 
    private String url; 
    private Image images; 
    private Date date; 
    private Boolean is_video; 

    protected News(Parcel in) { 
     id = in.readInt(); 
     type = in.readString(); 
     title = in.readString(); 
     category_name = in.readString(); 
     url = in.readString(); 
    } 

    public static final Creator<News> CREATOR = new Creator<News>() { 
     @Override 
     public News createFromParcel(Parcel in) { 
      return new News(in); 
     } 

     @Override 
     public News[] newArray(int size) { 
      return new News[size]; 
     } 
    }; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(id); 
     dest.writeString(type); 
     dest.writeString(title); 
     dest.writeString(category_name); 
     dest.writeString(url); 
    } 
} 






public class Image implements Parcelable { 
    public static final String TAG = "model_image"; 

private JSONObject imageObj; 
private JSONObject original; 

private String source; 
private int width; 
private Drawable image; 

protected Image(Parcel in) { 
    source = in.readString(); 
    width = in.readInt(); 
} 

public static final Creator<Image> CREATOR = new Creator<Image>() { 
    @Override 
    public Image createFromParcel(Parcel in) { 
     return new Image(in); 
    } 

    @Override 
    public Image[] newArray(int size) { 
     return new Image[size]; 
    } 
}; 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(source); 
    dest.writeInt(width); 
} 
} 
1

News.writeToParcel в:

dest.writeString(title); 
dest.writeByte((byte) (comment_disabled ? 1 : 0)); 
dest.writeString(category_name); 

в News.readToParcel:

title = in.readString(); 
category_name = in.readString(); 

Я думаю, что вы забыли readByte в readToParcel.

+0

mmh нет Я прочитал все свои поля – Lilrom

+0

Их нужно читать в точном в том же порядке они были написаны. –

+0

О, извините, мой плохой, ладно, я исправляю – Lilrom