Android RecyclerView没有';我不记得屏幕旋转时的选择
在我的Android RecyclerView没有';我不记得屏幕旋转时的选择,android,adapter,android-recyclerview,Android,Adapter,Android Recyclerview,在我的RecyclerView的Adapter中,我使用以下方法来记住当前选择的项目并在屏幕上恢复它: private final static String SELECTED_ITEM = "MyAdapter.selectedItem"; public void onSaveInstanceState(Bundle outState){ Log.i("onSave","OnSave "+mSelectedItem); outState.putInt(SELECTED_ITE
RecyclerView
的Adapter
中,我使用以下方法来记住当前选择的项目并在屏幕上恢复它:
private final static String SELECTED_ITEM = "MyAdapter.selectedItem";
public void onSaveInstanceState(Bundle outState){
Log.i("onSave","OnSave "+mSelectedItem);
outState.putInt(SELECTED_ITEM, mSelectedItem);
}
public void onRestoreInstanceState(Bundle savedInstanceState){
if(savedInstanceState.containsKey(SELECTED_ITEM)){
Log.i("onRestore","OnRestore " + savedInstanceState.getInt(SELECTED_ITEM));
notifyItemChanged(mSelectedItem);
mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM);
notifyItemChanged(mSelectedItem);
mRecyclerView.getLayoutManager().scrollToPosition(mSelectedItem);
}
}
在我的片段
中,我使用了回收视图
:
@Override
public void onSaveInstanceState(Bundle outState) {
if(null != mRecyclerView && null != mRecyclerView.getAdapter()){
((MyAdapter)mRecyclerView.getAdapter()).onSaveInstanceState(outState);
}
super.onSaveInstanceState(outState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(null!=savedInstanceState){
if(null != mRecyclerView && null != mRecyclerView.getAdapter()){
((MyAdapter)mRecyclerView.getAdapter()).onRestoreInstanceState(savedInstanceState);
}
}
}
我看到日志
消息,但是适配器
不记得选择 多亏了塞尔文,我很快意识到问题在于每次屏幕旋转时我都在重新创建片段
,而新的片段
,当然,没有要恢复的选择int
在根活动的onCreate
方法中,检查您是否第一次创建活动
:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
mContentLayout = (FrameLayout)findViewById(R.id.main_content_frame);
if(null==savedInstanceState) {
mFragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContentLayout.getId(), mPlatformsFragment);
fragmentTransaction.commit();
}
}
然后在片段中
,要保存所选项目,请使用:
private final static String SELECTED_ITEM = "MyAdapter.mSelectedItem";
//Save your selection
@Override
public void onSaveInstanceState(Bundle outState) {
if(null!=mAdapter){
outState.putInt(SELECTED_ITEM, mAdapter.mSelectedItem);
}
super.onSaveInstanceState(outState);
}
//Restore your selection
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
mAdapter.notifyItemChanged(platformsAdapter.mSelectedItem);
mAdapter.mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM, 0);
mAdapter.notifyItemChanged(platformsAdapter.mSelectedItem);
mRecyclerView.post(new Runnable() {
@Override
public void run() {
//Align selection to top
mLayoutManager
.scrollToPositionWithOffset(mAdapter.mSelectedItem, 0);
}
});
}
}
多亏了塞尔文,我很快意识到问题在于每次屏幕旋转时我都在重新创建片段
,当然,新的片段
,没有要恢复的选择int
在根活动的onCreate
方法中,检查您是否第一次创建活动
:
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
mContentLayout = (FrameLayout)findViewById(R.id.main_content_frame);
if(null==savedInstanceState) {
mFragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContentLayout.getId(), mPlatformsFragment);
fragmentTransaction.commit();
}
}
然后在片段中
,要保存所选项目,请使用:
private final static String SELECTED_ITEM = "MyAdapter.mSelectedItem";
//Save your selection
@Override
public void onSaveInstanceState(Bundle outState) {
if(null!=mAdapter){
outState.putInt(SELECTED_ITEM, mAdapter.mSelectedItem);
}
super.onSaveInstanceState(outState);
}
//Restore your selection
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
mAdapter.notifyItemChanged(platformsAdapter.mSelectedItem);
mAdapter.mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM, 0);
mAdapter.notifyItemChanged(platformsAdapter.mSelectedItem);
mRecyclerView.post(new Runnable() {
@Override
public void run() {
//Align selection to top
mLayoutManager
.scrollToPositionWithOffset(mAdapter.mSelectedItem, 0);
}
});
}
}
RecyclerView
有自己的。。。从Fragment的生命周期来看,似乎在所有视图的恢复安装状态之前调用了创建的onActivityCreated
。@Selvin它不存储关于适配器及其所选位置的任何信息。请进一步调试,并了解为什么mSelectedItem不更新您的UI。它不存储有关适配器及其所选位置的任何信息,因为它不是适配器的角色,而是RecyclerView本身(或其父项)…像一个符咒一样工作<代码>回收视图
有自己的。。。从Fragment的生命周期来看,似乎在所有视图的恢复安装状态之前调用了创建的onActivityCreated
。@Selvin它不存储关于适配器及其所选位置的任何信息。请进一步调试,并了解为什么mSelectedItem不更新您的UI。它不存储有关适配器及其所选位置的任何信息,因为它不是适配器的角色,而是RecyclerView本身(或其父项)…像一个符咒一样工作。。。