2016-02-29 78 views
0

我有一个自定义ArrayList的MovieItems,我想保存和恢复屏幕旋转。我检查了这个帖子 - How to save custom ArrayList on Android screen rotate? - 并且实现并修改了一些代码,但保存和恢复似乎不适合我。在Android屏幕上保存/恢复自定义ArrayList是否旋转?

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); 

    } 
+1

什么是“不工作”?请解释你期望发生的事情,以及这与实际发生的事情有何不同。 –

+0

当我关闭连接(飞行模式)并旋转屏幕时,我的电影海报列表应该被恢复。但他们没有恢复。但是我用下面的选定答案恢复了它。谢谢。 –

+0

您在下面接受的答案不是一个很好的通用解决方案。您不应该处理配置更改,除非您完全知道您希望自己的应用不像正常响应配置更改的正常Android应用那样运行。 –

回答

0

在相关活动代码,您的清单中添加这一行,和活动将处理本身旋转

android:configChanges="screenSize|orientation|screenLayout" 

测试也许帮助您

+0

你节省了我的时间,mamnunam;) –

4

因为你有setRetainInstance(true),屏幕旋转时不会销毁/重新创建Fragment。屏幕旋转后,Fragment将调用onSaveInstanceState(),但onCreate()部分不会发生。

-1

使用singletone对象来存储您的列表。 public enum MySingleton { INSTANCE; 私人MySingleton(){ System.out.println(“Here”); } private List mItems = new ArrayList <>(); public List getItems(){ return mItems; }}

和从任何地方MySingleton.INSTANCE.getItems()

-2

您可以尝试实现onRestoreInstanceState()方法,以及访问您的阵列。它在onStart()方法之后调用。你可以阅读了关于它onRestoreInstanceState