2017-10-12 14 views
0

J'expérimente des fragments. Je MainActivity composé d'un framelayout qui échange en fragments (maître "SearchFragment" et détail "LyricsFragment"):Comment ce fragment peut-il conserver son état lors de la rotation?

@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(); 
     } 
    } 
} 

J'utilise https://github.com/frankiesardo/icepick pour sauver mon état de SearchFragment dans un arrayList:

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

quelqu'un peut-il expliquer pourquoi les impressions des états de journal sur cette rotation:

tracks.size = 20 ---- ---- SCREEN tOURNER tracks.size = 20 tracks.size = 0

La liste est conservée au début mais finit par être effacée. Comment puis-je préserver le recyclaged peuplé après que je tourne? La librairie que j'utilise évite le standard de saveInstanceState. Je m'attendais à enregistrer ma liste et à la réinitialiser avec l'adaptateur lorsque l'appareil est pivoté.

Répondre

0

Vous devez stocker/re-stocker des variables d'état avec Icepick comme si,

@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

J'ai cela, mais ne mentionnaient pas dans la pâte – Marc