Parcelable을 구현하는 대신 @Parcel 주석을 사용하고 싶습니다.
그래서 내 수업은 다음과 같습니다.
@Parcel
public class UserSkillSpec {
private final String TAG = getClass().getSimpleName();
private Skill skill;
private int endorses = 0;
private boolean endorsed = false;
private List<User> endorsers = new LinkedList<>();
private int proficiency = 0;
private boolean verified = false;
@ParcelConstructor
public UserSkillSpec(Skill skill, int proficiency) {
this.skill = skill;
this.proficiency = proficiency;
}
}
프로젝트를 빌드하고 싶을 때 MessageBox에이 오류가 나타납니다.
Error:(62, 109) error: incompatible types: Object cannot be converted to User
사용자 소스 코드는 다음과 같습니다.
@Parcel
@RealmClass
public class User extends RealmObject {
@PrimaryKey
private String id;
private String firstName;
private String lastName;
private String name;
//and something else
public User() {
}
}
분명히이 문제는 List와 관련이 있습니다.
내 문제를 어떻게 해결할 수 있습니까?
감사.
EDIT1 : 사용자 클래스를 아래 코드로 변경했습니다.
@Parcel(implementations = {UserRealmProxy.class},
value = Parcel.Serialization.BEAN,
analyze = {User.class})
@RealmClass
public class User implements RealmModel {
@PrimaryKey
private String id;
private String firstName;
private String lastName;
private String name;
//somethings else
public User() {
}
}
Parceler 라이브러리에 의해 자동 생성 된 UserSkillSpec $$ Parcelable 클래스 에서 오류가 발생했습니다.
public static void write(UserSkillSpec userSkillSpec$$1, android.os.Parcel parcel$$1, int flags$$0, IdentityCollection identityMap$$0) {
int identity$$0 = identityMap$$0 .getKey(userSkillSpec$$1);
if (identity$$0 != -1) {
parcel$$1 .writeInt(identity$$0);
} else {
parcel$$1 .writeInt(identityMap$$0 .put(userSkillSpec$$1));
Skill$$Parcelable.write(InjectionUtil.getField(Skill.class, UserSkillSpec.class, userSkillSpec$$1, "skill"), parcel$$1, flags$$0, identityMap$$0);
parcel$$1 .writeInt(InjectionUtil.getField(int.class, UserSkillSpec.class, userSkillSpec$$1, "proficiency"));
if (InjectionUtil.getField(List.class, UserSkillSpec.class, userSkillSpec$$1, "endorsers") == null) {
parcel$$1 .writeInt(-1);
} else {
parcel$$1 .writeInt(InjectionUtil.getField(List.class, UserSkillSpec.class, userSkillSpec$$1, "endorsers").size());
for (User user$$0 : InjectionUtil.getField(List.class, UserSkillSpec.class, userSkillSpec$$1, "endorsers")) {
User$$Parcelable.write(user$$0, parcel$$1, flags$$0, identityMap$$0);
}
}
parcel$$1 .writeInt((InjectionUtil.getField(boolean.class, UserSkillSpec.class, userSkillSpec$$1, "verified")? 1 : 0));
parcel$$1 .writeInt(InjectionUtil.getField(int.class, UserSkillSpec.class, userSkillSpec$$1, "endorses"));
parcel$$1 .writeString(InjectionUtil.getField(String.class, UserSkillSpec.class, userSkillSpec$$1, "TAG"));
parcel$$1 .writeInt((InjectionUtil.getField(boolean.class, UserSkillSpec.class, userSkillSpec$$1, "endorsed")? 1 : 0));
}
}
마침내 문제를 해결하고 공유하기로 결정했습니다.
팁 : 1. 목록은 일반이어야합니다. List<Item>
하지 List
2. 사용 @ParcelPropertyConverter(ItemListParcelConverter.class)
의 선언List<Item>
그래서 내 코드는 다음과 같습니다.
@Parcel(implementations = {UserRealmProxy.class},
value = Parcel.Serialization.BEAN,
analyze = {User.class})
public class User extends RealmObject {
@PrimaryKey
private String id;
private String firstName;
private String lastName;
private String name;}
그리고 이것:
@Parcel
public class UserSkillSpec {
private Skill skill;
private int endorses = 0;
private boolean endorsed = false;
@ParcelPropertyConverter(ItemListParcelConverter.class)
private List<User> endorsers = new LinkedList<>();
private int proficiency = 0;
private boolean verified = false;
public UserSkillSpec() {
}
}
그리고 이것은 parcelConvertor 클래스입니다.
public class ItemListParcelConverter<T> extends ArrayListParcelConverter<T> {
@Override
public void itemToParcel(T item, Parcel parcel) {
parcel.writeParcelable(Parcels.wrap(item), 0);
}
@Override
public T itemFromParcel(Parcel parcel) {
return Parcels.unwrap(parcel.readParcelable(getClass().getClassLoader()));
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다