2017-10-12 86 views
0

我正在试验片段。我有MainActivity包括在片段交换一个的FrameLayout的(主 “SearchFragment” 和细节 “LyricsFragment”):该片段如何在旋转时保持状态

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 

    int index = fragmentManager.getBackStackEntryCount() - 1; 
    if (index == -1) { 
     fragmentManager.beginTransaction() 
       .replace(R.id.placeholder, new SearchFragment(), SEARCH) 
       .commit(); 
    } else { 
     FragmentManager.BackStackEntry backEntry = fragmentManager.getBackStackEntryAt(index); 
     String tag = backEntry.getName(); 
     Fragment fragment = fragmentManager.findFragmentByTag(tag); 
     if (fragment != null) { 
      fragmentManager.beginTransaction() 
        .replace(R.id.placeholder, fragment) 
        .commit(); 
     } 
    } 
} 

我使用https://github.com/frankiesardo/icepick在其中保存的ArrayList我SearchFragment的状态:

public class SearchFragment extends Fragment { 

    @Inject CompositeSubscription subscriptions; 

    @BindView(R.id.search_field) EditText searchField; 
    @BindView(R.id.recyclerview) RecyclerView recyclerView; 

    @State ArrayList<Track> tracks = new ArrayList<>(); 
    private TrackAdapter adapter; 
    private TrackClickListener listener; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof TrackClickListener) { 
      listener = (TrackClickListener) context; 
     } else { 
      throw new IllegalArgumentException("context must be of type TrackClickListener"); 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_search, container, false); 
     bindViews(view); 

     adapter = new TrackAdapter(listener, picasso); 
     recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), COLS)); 
     recyclerView.setAdapter(adapter); 
     Log.d("TRACK", "tracks.size=" + tracks.size()); 
     adapter.setAdapterItems(tracks); 
     return view; 
    } 

    @VisibleForTesting 
    void onSearchSuccess(ArrayList<Track> tracks) { 
     this.tracks = tracks; 
     adapter.setAdapterItems(tracks); 
    } 

    @OnClick(R.id.search_button) 
    void onSearchClick() { 
     searchTracks(); 
    } 

    private void searchTracks() { 
     subscriptions.add(api.searchTracks(searchTerm) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<SearchResult>() { 

        @Override 
        public void onCompleted() {} 
        @Override 
        public void onError(Throwable e) {} 

        @Override 
        public void onNext(SearchResult searchResult) { 
         onSearchSuccess(searchResult.getResults()); 
        } 
       })); 
    } 

public interface TrackClickListener { 
    void startDetailScreen(Track track); 
} 
} 

有人可以解释为什么在旋转日志语句打印此:

tracks.size = 20 ----旋转屏幕---- tracks.size = 20 tracks.size = 0

该列表首先被保留,但最终被清除。我在旋转后如何保留填充的recyclerview?我正在使用的库避免了saveInstanceState的样板文件。我希望我的列表能够保存,并且适配器可以在设备旋转时用它重置。

回答

0

您需要存储与ICEPICK像这样/重新储存状态变量,

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Icepick.restoreInstanceState(this, savedInstanceState); 
} 

@Override protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Icepick.saveInstanceState(this, outState); 
} 
+0

我有,但没有包括在贴 – Marc

相关问题