Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能。
一般来说, 调用onPause()和onStop()方法后的activity 实例仍然存在于内存中, activity 的所有信息和状态数据不会消失, 当 activity 重新回到前台之后,所有的改变都会得到保留
//用于记录位置@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
//获取recycler的管理器
LinearLayoutManager layoutManager = ((LinearLayoutManager)binging.newsRecyclerView.getLayoutManager());
//获取当前第一个显示的item
int fistVisiblePosition = layoutManager.findFirstVisibleItemPosition();
//按位置查找视图
View itemView = layoutManager.findViewByPosition(fistVisiblePosition);
//当滑动的时候有的页面没有被销毁还在 如过调用就是空 所以加次判断
if(itemView ==null){
return;
}
//获取当前位置的Y
int y = (int) itemView.getY();
//记录位置
outState.putInt("position",fistVisiblePosition);
outState.putInt("offset",y);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在创建fragment的时候调用还不可见时就进行复位
if(savedInstanceState !=null){
targetPosition = savedInstanceState.getInt("position");
targetOffset = savedInstanceState.getInt("offset");
}}
当然这些还不够
//滚动到获取位置 让刚退出的可见位置恢复到Y坐标
//为什么在请求的数据第一次的时候那,因为当滑动多的时候他请求的数据会被销毁,所以会二次请求
scrollToTargetPosition();
//滚动到获取位置 让刚退出的可见位置恢复到Y坐标
private void scrollToTargetPosition() {
binging.newsRecyclerView.post(new Runnable() {
@Override
public void run() {
//获得管理器
LinearLayoutManager layoutManager = (LinearLayoutManager)binging.newsRecyclerView.getLayoutManager();
//获取当前第一个显示的item
int position = layoutManager.findFirstVisibleItemPosition();
//如过他当前的位置和记录的位置不一样
if(position !=targetPosition){
//滚动到获取位置(标识的位置,标识的偏移量)
layoutManager.scrollToPositionWithOffset(targetPosition,targetOffset);
}
}
});
}