Quelle est la meilleure façon d'économiser de l'état de RecyclerView?
J'ai fragment contient recyclerview dans l'activité principale
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
dans la méthode onCreate:
myFragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(MyFragment.TAG);
if (MyFragment == null) {
MyFragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(R.id.content_frame,
myFragment, MyFragment.TAG).commit();
}
Mais lorsque l'orientation changé, mon RecyclerView redessiné.
J'ai essayé d'économiser de l'etat au remplacement onSaveInstanceState
et onRestoreInstanceState
comme ce Comment prévenir les vues personnalisées de perdre de l'etat à travers les changements d'orientation de l'écran ou La sauvegarde et la restauration de l'état d'affichage android, mais en vain, pour moi
Comment correctement enregistrer l'état de RecyclerView et de l'adaptateur d'éléments lorsque le changement d'orientation?
SOLUTION:
Mon fragment s'étend de BaseFragment avec certaines méthodes:
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();
}
Dans mon fragment-je remplacer les méthodes et enregistrer l'état de 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"));
}
OriginalL'auteur olle | 2015-04-24
Vous devez vous connecter pour publier un commentaire.
J'ai cherché comment faire pour obtenir la position de défilement de la RecyclerView, mais ne vois pas où je peux le récupérer, donc je pense que la meilleure solution est de la rotation de la poignée des modifications directement dans votre code java, et de prévenir de votre activité à redémarrer sur le changement d'orientation.
Pour empêcher le redémarrage sur le changement d'orientation, vous pouvez suivre cette solution.
Après la prévention de votre Activité à partir de redémarrage, vous pouvez construire 2 xml fichiers de mise en page, l'un pour le mode portrait, et un pour le mode paysage, vous ajoutez un FrameLayout dans deux fichiers xml, tenant la place pour votre RecyclerView.
Lorsque le onConfigurationChange(Configuration newConfig) la méthode est appelée, vous appelez setContentView(int layoutFile) avec les LayoutFile à la suite de la nouvelle orientation, et d'ajouter votre RecyclerView vous êtes maintenant un membre de votre classe dans la FrameLayout.
OriginalL'auteur Louis CAD