2017-01-01 3 views
0

네트워크 호출을 통해 데이터를로드하고 장치가 onSaveInstanceState 콜백에 저장된 데이터를 순환하면 어댑터에 변경 사항이 통지되지만 이후에 활동이 공백이됩니다. 회전. 코드 단편은 다음과 같다 :onSaveInstanceState 콜백에 저장된 장치 데이터가로드되지 않습니다.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    // setSupportActionBar(toolbar); 

    movies=new ArrayList<Movie_model>(); 

    madapter=new Movie_adapter(this,new Movie_adapter.OnItemClickListener(){ 
     @Override 
     public void onItemClick(Movie_model movie_item) { 
      Toast.makeText(getApplicationContext(), "Item Clicked", Toast.LENGTH_LONG).show(); 
      Intent intent=new Intent(getApplicationContext(),MovieDetail.class); 
      intent.putExtra("Movie_item", movie_item); 
      intent.putExtra("type", "normal"); 
      startActivity(intent); 
     }; 
    },movies); 
    mAdapterFav = new CustomCursorAdapter(this,new CustomCursorAdapter.OnItemClickListener(){ 
     @Override 
     public void onItemClick(Movie_model movie_item) { 
      Toast.makeText(getApplicationContext(), "Item Clicked", Toast.LENGTH_LONG).show(); 
      Intent intent=new Intent(getApplicationContext(),MovieDetail.class); 
      intent.putExtra("Movie_item", movie_item); 
      intent.putExtra("type", "fav"); 
      startActivity(intent); 
     };}); 
    recyclerview = (RecyclerView) findViewById(R.id.recyclerview); 
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(),3); 
    recyclerview.setLayoutManager(mLayoutManager); 
    recyclerview.setItemAnimator(new DefaultItemAnimator()); 
    recyclerview.setAdapter(madapter); 
    if(savedInstanceState!=null) 
    { 
     // movies.clear(); 
     Log.i("tag", String.valueOf(movies.size())); 
     movies=savedInstanceState.getParcelableArrayList("list"); 
     madapter.notifyDataSetChanged(); 
     //recyclerview.setAdapter(madapter); 
     // Log.i("tag", String.valueOf(movies.size())); 
    } 
    else 
    { 
     mnetworking= new Networking(); 
     mnetworking.execute(discover_movies); 
     Log.i("tag","in"); 
    } 

} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putParcelableArrayList("list",movies); 
    Log.i("tag", String.valueOf(movies.size())); 
} 

은 또한리스트의 크기 getParcelableArrayList ("리스트") 후 20주의; 호출됩니다. 그리고 마음 boggler은 해당 어댑터가 다시 초기화 할 때 성명, 데이터는 rotataion에 표시되어있는 경우

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    // setSupportActionBar(toolbar); 

    movies=new ArrayList<Movie_model>(); 

    madapter=new Movie_adapter(this,new Movie_adapter.OnItemClickListener(){ 
     @Override 
     public void onItemClick(Movie_model movie_item) { 
      Toast.makeText(getApplicationContext(), "Item Clicked", Toast.LENGTH_LONG).show(); 
      Intent intent=new Intent(getApplicationContext(),MovieDetail.class); 
      intent.putExtra("Movie_item", movie_item); 
      intent.putExtra("type", "normal"); 
      startActivity(intent); 
     }; 
    },movies); 
    mAdapterFav = new CustomCursorAdapter(this,new CustomCursorAdapter.OnItemClickListener(){ 
     @Override 
     public void onItemClick(Movie_model movie_item) { 
      Toast.makeText(getApplicationContext(), "Item Clicked", Toast.LENGTH_LONG).show(); 
      Intent intent=new Intent(getApplicationContext(),MovieDetail.class); 
      intent.putExtra("Movie_item", movie_item); 
      intent.putExtra("type", "fav"); 
      startActivity(intent); 
     };}); 
    recyclerview = (RecyclerView) findViewById(R.id.recyclerview); 
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(),3); 
    recyclerview.setLayoutManager(mLayoutManager); 
    recyclerview.setItemAnimator(new DefaultItemAnimator()); 
    recyclerview.setAdapter(madapter); 
    if(savedInstanceState!=null) 
    { 
     // movies.clear(); 
     Log.i("tag", String.valueOf(movies.size())); 
     movies=savedInstanceState.getParcelableArrayList("list"); 
    // madapter.notifyDataSetChanged(); 
     madapter=new Movie_adapter(this,new Movie_adapter.OnItemClickListener(){ 
      @Override 
      public void onItemClick(Movie_model movie_item) { 
       Toast.makeText(getApplicationContext(), "Item Clicked", Toast.LENGTH_LONG).show(); 
       Intent intent=new Intent(getApplicationContext(),MovieDetail.class); 
       intent.putExtra("Movie_item", movie_item); 
       intent.putExtra("type", "normal"); 
       startActivity(intent); 
      }; 
     },movies); 
     recyclerview.setAdapter(madapter); 
     Log.i("tag", String.valueOf(movies.size())); 
    } 
    else 
    { 
     mnetworking= new Networking(); 
     mnetworking.execute(discover_movies); 
     Log.i("tag","in"); 
    } 

} 
+0

그냥 질문이 있습니까? 당신도 Udacity Nanodegree하고 있습니까? –

+0

@KartikSharma 예 –

답변

1

당신이 savedInstanceState의 값을 검색하기 전에 log, 당신은 다음 검색 값을 로깅되지 않을 것입니다 .

당신이 그런 식으로 동영상 데이터를 (이미이없는 경우) 다음, 어댑터 클래스에 오퍼레이션과 addAll 메소드를 추가 추가해야 할 수도 있습니다처럼 보이는

: 어댑터 클래스 내부

if(savedInstanceState != null){ 
    movies = savedInstanceState.getParcelableArrayList("list"); 
    madapter.addAll(movies); // Make sure you add an addAll() in your adapter's class first 
    madapter.notifyDataSetChanged(); 
} 
// The rest of your code 

public void addAll(ArrayList al){ 
    for(int i=0; i < al.size; i++){ 
     // add to your adapter's data set 
     // yourDataSet.add(al.get(i)); 
    } 
} 
+0

어댑터에 addAll() 메소드가 없습니다. –

+0

데이터 세트에 데이터가 있고, 데이터가 표시되지 않습니다. –

+0

'movies'에 데이터 또는 madapter가 있습니까? –