我在主活动中有包含recyclerview的片段
片段.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);
}
main活动.java
在oncreate方法中:
myFragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(MyFragment.TAG);
if (MyFragment == null) {
MyFragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(R.id.content_frame,
myFragment, MyFragment.TAG).commit();
}
但当方向改变时,我的回收站视图重新绘制。
我已经尝试过这样覆盖
onSaveInstanceState
和onRestoreInstanceState
的save stateHow to prevent custom views from losing state across screen orientation changes或Saving and restoring view state android,但对我没有帮助方向改变时,如何正确保存recyclerview和adapter项的状态?
解决方案:
我的片段通过一些方法从BaseFragment扩展而来:
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();
}
在我的片段中,我重写方法并保存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"));
}
最佳答案
我搜索了如何获取RealReVIEW的滚动位置,但没有看到在哪里可以检索它,因此我认为最好的解决方案是直接处理Java代码中的旋转更改,并防止您的活动在方向更改上重新启动。
要防止在方向更改时重新启动,您可以遵循this solution。
阻止活动重新启动后,您可以构建两个XML布局文件,一个用于纵向模式,另一个用于横向模式,然后在两个XML文件中添加一个FrameLayout,保留RecyclerView的位置。
调用onconfigurationchange(configuration newconfig)方法时,可以调用setcontentview(int layoutfile),并在新方向后使用适当的layoutfile,然后在framelayout中的类成员中添加您持有的recyclerview。