【问题标题】:The last of the getParcelableArrayList element appears as empty stringgetParcelableArrayList 元素的最后一个显示为空字符串
【发布时间】:2022-01-20 07:56:41
【问题描述】:

当我将 parcelable arraylist 放入包中并使用getParcelableArrayList 获取它时,所有元素都正确显示,而最后一个元素显示为空字符串。

我的自定义 Parcelable 物品:

public class Media implements Parcelable {

    private final Uri uri;
    private Type type;
    private InfoModel infoModel;

    public Media(Uri uri, Type type) {
     
        this.uri = uri;
        this.type = type;
        this.infoModel = InfoModel.empty();
    }

    public Media() {
        this.uri = null;
        this.type = Type.image;
        this.infoModel = InfoModel.empty();
    }

    protected Media(Parcel in) {
        uri = in.readParcelable(Uri.class.getClassLoader());
        type = Type.valueOf(in.readString());
        infoModel = in.readParcelable(InfoModel.class.getClassLoader());
    }

    public void setInfoModel(InfoModel infoModel) {
        this.infoModel = infoModel;
    }

    public InfoModel getInfoModel() {
        return infoModel;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(uri, flags);
        dest.writeString(this.type.name());
        dest.writeParcelable(infoModel, flags);
    }

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

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Media media = (Media) o;

        return uri.equals(media.uri);
    }

    @Override
    public int hashCode() {
        return uri.hashCode();
    }
}

当我检查 bundle 中的媒体列表时,我发现没有问题 -> bundleIntent 函数:

public class ShowMediaActivity extends Activity {

    public static Intent buildIntent(@NonNull ArrayList<Media> medias) {
            Intent intent = new Intent(this, ShowMediaActivity.class);
            Bundle b = new Bundle();
            b.putParcelableArrayList(KEY_MEDIA, medias);
            intent.putExtra("bundle", b);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            return intent;
        }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Logger.i();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_container);

        Bundle b = getIntent().getBundleExtra("bundle");
        List<Media> initialMedia = new ArrayList<>();
        if (b != null) {
            initialMedia = b.getParcelableArrayList(KEY_MEDIA);
        }

     }

onCreate 中的initialMedia 元素:

initialMedia 有 1 个元素:媒体

initialMedia 有 2 个元素:Media, ""

initialMedia 有 3 个元素:Media、Media、""

initialMedia 有 4 个元素:Media、Media、Media、""

【问题讨论】:

  • 您是否在 RUNTIME 中验证了最后一个元素是否真的是字符串,或者您只是在调试期间使用 IDE Inspector 验证它?有时 Inspector 会显示错误的值(很少见,但有时会发生)。尝试在 LogCat 中打印类似于“Log.d(TAG, List[n].class.getName())”的内容
  • 我在调试中试过了。我也尝试了 logcat,它给出了相同的结果。
  • 那么最后一个元素的类是“java.lang.String”而不是之前的“a.b.Media”?
  • 就像你说的
  • 我只是复制/粘贴了您的代码并进行了模拟。它按预期工作,检索正确的“initialMedia”变量。也许您还有其他东西可以在该数组中添加/插入项目(可能通过反射)。不可能有一个 ArrayList 里面有这些不均匀的项目。 String 不是 Parcelable,不能正常插入/添加到 Parcelables 的 ArrayList 中。

标签: android arraylist parcelable


【解决方案1】:

我在 in.readInt() 而不是 in.readLong() 的 InfoModel 类中留下了一个我转换为 long 的项目。我完全没有意识到这一点。感谢您的帮助@emandt

    public InfoModel(Parcel in) {
        startTime = in.readLong();
        endTime = in.readLong();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(startTime);
        dest.writeLong(endTime);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2023-03-14
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多