zerokkqq 2021-04-12 17:41 采纳率: 0%
浏览 10

recyclerView Class not found when unmarshalling

recyclerView

实现 一个 SaveData

在不保留活动时就 会报 Class not found when unmarshalling

这是bug还是有意为之?

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-07-18 16:15
    关注
    让阿豪来帮你解答,本回答参考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 发生。

    评论

报告相同问题?