在开发过程中有的时候需要保留recyclerView的滑动位置,让用户体验更加友好,就比如微信朋友圈,点击返回再次进入依然是之前浏览过的位置,实现起来并不难。
1.要知道可显示的第一个或者最后一个item距离顶部的距离。
2.得到可显示的第一个或者最后一个item是第几个item(position)。
3.保留这两个值,我用的SharedPreferences。
4.在Activity的生命周期方法onPause和onResume中保留和读取。
packagecom.cnbs.mypratcice;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.SharedPreferences;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.view.KeyEvent;
importandroid.view.LayoutInflater;
importandroid.view.View;
public classMain2ActivityextendsAppCompatActivity {
privateRecyclerViewrecyclerView;
private intlastOffset;//距离
private intlastPosition;//第几个item
privateSharedPreferencessharedPreferences;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
recyclerView= (RecyclerView) findViewById(R.id.my_recycler);
MyAdapter adapter =newMyAdapter(Main2Activity.this);
LinearLayoutManager linearLayoutManager =newLinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(adapter);
//监听recyclerview的滑动
recyclerView.addOnScrollListener(newRecyclerView.OnScrollListener() {
@Override
public voidonScrollStateChanged(RecyclerView recyclerView,intnewState) {
super.onScrollStateChanged(recyclerView, newState);
if(recyclerView.getLayoutManager() !=null) {
getPositionAndOffset();
}
}
});
// position = linearLayoutManager.findFirstVisibleItemPosition();
// View view = recyclerView.getChildAt(position);
// if (view != null) {
// listViemItemTop = view.getTop();
// }
}
/**
* 记录RecyclerView当前位置
*/
private voidgetPositionAndOffset() {
LinearLayoutManager layoutManager = (LinearLayoutManager)recyclerView.getLayoutManager();
//获取可视的第一个view
View topView = layoutManager.getChildAt(0);
if(topView !=null) {
//获取与该view的顶部的偏移量
lastOffset= topView.getTop();
//得到该View的数组位置
lastPosition= layoutManager.getPosition(topView);
sharedPreferences= getSharedPreferences("key", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor =sharedPreferences.edit();
editor.putInt("lastOffset",lastOffset);
editor.putInt("lastPosition",lastPosition);
editor.commit();
}
}
@Override
protected voidonPause() {
super.onPause();
getPositionAndOffset();
}
@Override
protected voidonResume() {
super.onResume();
scrollToPosition();
}
/**
* 让RecyclerView滚动到指定位置
*/
private voidscrollToPosition() {
sharedPreferences= getSharedPreferences("key",Activity.MODE_PRIVATE);
lastOffset=sharedPreferences.getInt("lastOffset",0);
lastPosition=sharedPreferences.getInt("lastPosition",0);
if(recyclerView.getLayoutManager() !=null&&lastPosition>=0) {
((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(lastPosition,lastOffset);
}
}
}
因为ListView有相关方法所以实现起来会更加方便,而recyclerView相对代码就多敲了一点而已,但是也好实现。