Was ist der beste Weg, um zu sparen Zustand der RecyclerView?
Ich habe fragment enthält recyclerview in Haupttätigkeit
Fragment.java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.activity_main, container, false);
initInstances(view);
setRetainInstance(true);
return view;
}
private void initInstances(View view) {
mRecyclerView = (RecyclerView) view.findViewById(R.id.dialogList);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
adapter = new MyAdapter(items);
mRecyclerView.setAdapter(mAdapter);
}
MainActivity.java
in der onCreate-Methode:
myFragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(MyFragment.TAG);
if (MyFragment == null) {
MyFragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(R.id.content_frame,
myFragment, MyFragment.TAG).commit();
}
Aber wenn die Ausrichtung verändert, mein RecyclerView neu gezeichnet.
Habe ich versucht, Zustand speichern mit überschreiben onSaveInstanceState
und onRestoreInstanceState
wie diese Wie um zu verhindern, dass benutzerdefinierte Ansichten verlieren Zustand über änderungen der Bildschirmausrichtung oder Speichern und wiederherstellen von view-Zustand android, aber ohne Erfolg für mich
Wie richtig Zustand speichern der RecyclerView und adapter items-wenn die Ausrichtung ändern?
LÖSUNG:
Mein fragment erstreckt sich von BaseFragment mit einigen Methoden:
public class BaseFragment extends Fragment{
Bundle savedState;
public BaseFragment() {
super();
if (getArguments() == null)
setArguments(new Bundle());
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!restoreStateFromArguments()) {
onFirstTimeLaunched();
}
}
protected void onFirstTimeLaunched() {
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveStateToArguments();
}
public void saveStateToArguments() {
if (getView() != null)
savedState = saveState();
if (savedState != null) {
Bundle b = getArguments();
b.putBundle("internalSavedViewState8954201239547", savedState);
}
}
private boolean restoreStateFromArguments() {
Bundle b = getArguments();
savedState = b.getBundle("internalSavedViewState8954201239547");
if (savedState != null) {
onRestoreState(savedState);
return true;
}
return false;
}
private Bundle saveState() {
Bundle state = new Bundle();
onSaveState(state);
return state;
}
protected void onRestoreState(Bundle savedInstanceState) {
}
protected void onSaveState(Bundle outState) {
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroyView() {
super.onDestroyView();
saveStateToArguments();
}
In meinem fragment die ich überschreiben Methoden und Zustand speichern von mLayoutManager
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
protected void onSaveState(Bundle outState) {
super.onSaveState(outState);
outState.putParcelable("myState", mLayoutManager.onSaveInstanceState());
}
@Override
protected void onRestoreState(Bundle savedInstanceState) {
super.onRestoreState(savedInstanceState);
mLayoutManager.onRestoreInstanceState(savedInstanceState.getParcelable("myState"));
}
- Die Uneinheitlichkeit zwischen config ändert und das fragment backstack ist ein absoluter Albtraum. Danke für die Idee. Dies scheint sich gelöst zu haben, meine Probleme für den Moment.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gesucht, wie man die scroll-position der RecyclerView, aber nicht sehen, wo ich abrufen kann, so dass ich denke, die beste Lösung ist, um zu behandeln-Drehung änderungen direkt in Ihre java-code, und verhindert, dass Ihre Aktivitäten neu zu starten, auf Orientierung ändern.
Um zu verhindern, dass ein Neustart auf Orientierung ändern, können Sie diese Lösung.
Nachdem die verhindert, dass Ihre Tätigkeit von Neustart können Sie bauen 2 xml-layout-Dateien, eine für den portrait-Modus und eines für den landscape-Modus, fügen Sie ein FrameLayout in beiden xml-Dateien, und hält den Platz für Ihre RecyclerView.
Wenn die onConfigurationChange(Konfiguration newConfig) - Methode aufgerufen wird, rufen Sie setContentView(int layoutFile) mit den entsprechenden LayoutFile nach der neuen Ausrichtung, und fügen Sie Ihre RecyclerView Sie halten ein Mitglied Ihrer Klasse in das FrameLayout.