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的样板文件。我希望我的列表能够保存,并且适配器可以在设备旋转时用它重置。
我有,但没有包括在贴 – Marc