2017-03-16 11 views
0

アクティビティにonSaveInstanceStateを上書きして、オブジェクトのArrayListを保存しています。そのアクティビティのonCreateメソッドでは、私が保存したオブジェクトのリストを復元しました。 Iオブジェクトだけでなく、スクロール位置だけでなくが復元された画面を回転させる場合画面を回転させたときのスクロール位置の保存方法は?

public class MovieListActivity extends AppCompatActivity { 

private EndlessRecyclerViewScrollListener scrollListener; 
private ArrayList<Movie> movies; 
private MovieListAdapter movieListAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_movie_list); 
    RecyclerView moviesRecyclerView = (RecyclerView) findViewById(R.id.movie_list_rv); 

    if (savedInstanceState == null || !savedInstanceState.containsKey("movieList")) { 
     movies = createMovies(30); 
    } else { 
     // Restoring only the list of movies not the scroll position 
     movies = savedInstanceState.getParcelableArrayList("movieList"); 
    } 

    movieListAdapter = new MovieListAdapter(this, movies); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 

    moviesRecyclerView.setAdapter(movieListAdapter); 
    moviesRecyclerView.setLayoutManager(layoutManager); 

    scrollListener = new EndlessRecyclerViewScrollListener(layoutManager) { 
     @Override 
     public void onLoadMore(int page, final int totalItemsCount, RecyclerView view) { 
      Handler handler = new Handler(); 
      final Runnable r = new Runnable() { 
       public void run() { 
        movies.addAll(createMovies(20)); 
        movieListAdapter.notifyItemRangeInserted(totalItemsCount, movies.size() - 1); 
       } 
      }; 
      handler.post(r); 
     } 
    }; 
    moviesRecyclerView.addOnScrollListener(scrollListener); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // Saving only the list of movies 
    outState.putParcelableArrayList("movieList", movies); 
    super.onSaveInstanceState(outState); 
} 

private ArrayList<Movie> createMovies(int numberOfMovies) { 
    ArrayList<Movie> movieList = new ArrayList<>(); 
    for(int i=0; i<numberOfMovies; i++) { 
     movieList.add(new Movie("Hello", new DateTime("2017-03-16T01:20"), "This is a very good movie")); 
    } 
    Log.i("Create", "create called"); 
    return movieList; 
} 

}

- ここ

活動からのコードです。

  1. スクロール位置が保存されずに復元されるのはどうしてですか?
  2. super.onCreate(savedInstanceState)を呼び出すとスクロール位置が自動的に保存されますか?エミュレータの

スクリーンショットの前と後の回転 - 助けを

enter image description here

感謝を回転させた後

enter image description here

&を回転させる前に!

+0

ビューは独自の状態を保存します。リストビューは、どのアイテムが最初に目に見えるアイテムであるかを保存します。 – njzk2

+0

@ njzk2しかし、画面を回転させるとアクティビティは再作成されませんか?どのようにビューが状態を保存するかについて私が読むことができるいくつかのリソースを教えてください。 –

+0

再作成されますが、ビューの状態は保存され、自動的に復元されます。 – njzk2

答えて

0

アクティビティが停止し始めると、システムはonSaveInstanceState()メソッドを呼び出して、アクティビティがキーと値のペアの集合で状態情報を保存できるようにします。このメソッドのデフォルトの実装では、このようなより多くの情報のためのEditTextウィジェット内のテキストまたはリストビューウィジェット

のスクロール位置としての活動のビュー階層の状態に関する過渡的な情報がの保存と復元活動状態を参照してください。保存し in https://developer.android.com/guide/components/activities/activity-lifecycle.html

関連する問題