recyclerView
实现 一个 SaveData
在不保留活动时就 会报 Class not found when unmarshalling
这是bug还是有意为之?
recyclerView
实现 一个 SaveData
在不保留活动时就 会报 Class not found when unmarshalling
这是bug还是有意为之?
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言这是一个 bug。 当不保留活动时,系统会尝试将活动和其状态(例如 RecyclerView 中的数据)保存到 Bundle 中以便稍后恢复。但是如果 RecyclerView 中的数据对象没有实现 Parcelable 接口,就会导致报错 "Class not found when unmarshalling"。 为了解决这个问题,需要确保 RecyclerView 中的数据对象实现 Parcelable 接口,以便正确地保存和恢复数据。下面是一个示例: 首先,需要在数据对象中实现 Parcelable 接口,例如:
public class DataItem implements Parcelable {
private String name;
private int age;
public DataItem(String name, int age) {
this.name = name;
this.age = age;
}
protected DataItem(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator<DataItem> CREATOR = new Creator<DataItem>() {
@Override
public DataItem createFromParcel(Parcel in) {
return new DataItem(in);
}
@Override
public DataItem[] newArray(int size) {
return new DataItem[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
@Override
public int describeContents() {
return 0;
}
}
然后,在 RecyclerView 的 Adapter 中保存和恢复数据对象:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<DataItem> dataList;
// Constructor and other methods
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// Inflate view and return ViewHolder
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
DataItem dataItem = dataList.get(position);
// Bind dataItem to ViewHolder
}
@Override
public int getItemCount() {
return dataList.size();
}
@Override
public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
recyclerView.setSaveEnabled(false); // Disable saving RecyclerView state
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
recyclerView.setSaveEnabled(true); // Enable saving RecyclerView state
}
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
super.onViewRecycled(holder);
holder.setDataItem(null); // Clear dataItem from ViewHolder
}
// ViewHolder class
}
通过实现 Parcelable 接口和正确地保存恢复数据,可以避免 "Class not found when unmarshalling" 的 bug 发生。