【问题标题】:Saving/Restoring custom ArrayList on Android screen rotate?在Android屏幕旋转上保存/恢复自定义ArrayList?
【发布时间】:2016-06-12 21:45:30
【问题描述】:

我有一个自定义的 MovieItems ArrayList,我想在屏幕旋转时保存和恢复。我查看了这篇文章 - How to save custom ArrayList on Android screen rotate? - 并实施并调整了一些代码,但保存和恢复似乎对我不起作用。

1) 保存 ArrayList:

public List<MovieItem> mItems = new ArrayList<>();

@Override
public void onSaveInstanceState(Bundle outState) {

    outState.putParcelableArrayList(MOVIE_KEY, (ArrayList<? extends Parcelable>) mItems);
    super.onSaveInstanceState(outState);
}

2) 恢复ArrayList:

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        if (savedInstanceState != null)
        {

            mItems = savedInstanceState.getParcelableArrayList(MOVIE_KEY);
        }
        setRetainInstance(true);
......

    }

3) 使 MovieItem 类 Parcelable:

public class MovieItem implements Parcelable{



    private static final long serialVersionUID = 1L;

    private String mCaption;
    private String mId;
    private String mUrl;
    private String plot;
    private Double rating;
    private String release_date;
    private boolean favourite;

    public MovieItem() {
    }

    protected MovieItem(Parcel in) {
        mCaption = in.readString();
        mId = in.readString();
        mUrl = in.readString();
        plot = in.readString();
        release_date = in.readString();
        favourite = in.readByte() != 0;
        mTitle = in.readString();
    }

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

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

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

    @Override
    public void writeToParcel(Parcel out, int flags) {

        out.writeString(mCaption);
        out.writeString(mId);
        out.writeString(mUrl);
        out.writeString(plot);
        out.writeDouble(rating);
        out.writeString(release_date);

    }

【问题讨论】:

  • 什么是“不工作”?请说明您预计会发生什么,以及这与实际发生的情况有何不同。
  • 当我关闭连接(飞行模式)并旋转屏幕时,我的电影海报列表应该会恢复。但他们没有恢复。但我用下面选择的答案恢复了它。谢谢。
  • 您在下面接受的答案不是一个很好的通用解决方案。除非您绝对知道您不希望您的应用像正常的 Android 应用那样正确响应配置更改,否则您不应该处理配置更改。

标签: android arraylist parcelable screen-rotation parcel


【解决方案1】:

因为您有setRetainInstance(true),所以Fragment 在屏幕旋转时不会被破坏/重新创建。 Fragment 将在屏幕旋转后调用onSaveInstanceState(),但不会出现onCreate() 部分。

【讨论】:

    【解决方案2】:

    使用单调对象来存储您的列表。 公共枚举 MySingleton { 实例; 私人 MySingleton() { System.out.println("这里"); } 私有列表 mItems = new ArrayList(); 公共列表 getItems(){ 返回 mItems; } }

    以及从任何地方访问您的数组 MySingleton.INSTANCE.getItems()

    【讨论】:

      【解决方案3】:

      您也可以尝试实现 onRestoreInstanceState() 方法。它在 onStart() 方法之后调用。你可以阅读它onRestoreInstanceState

      【讨论】:

        【解决方案4】:

        将此行添加到相关活动标签的清单中,活动将自行处理轮换

        android:configChanges="screenSize|orientation|screenLayout" 
        

        测试一下可能对你有帮助

        【讨论】:

        • 你节省了我的时间,mamnunam ;)
        猜你喜欢
        • 2012-09-12
        • 2014-03-06
        • 2016-12-11
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        相关资源
        最近更新 更多