在開發(fā)過程中有的時(shí)候需要保留recyclerView的滑動(dòng)位置漱挎,讓用戶體驗(yàn)更加友好涧至,就比如微信朋友圈,點(diǎn)擊返回再次進(jìn)入依然是之前瀏覽過的位置同眯,實(shí)現(xiàn)起來并不難。
1.要知道可顯示的第一個(gè)或者最后一個(gè)item距離頂部的距離硅确。
2.得到可顯示的第一個(gè)或者最后一個(gè)item是第幾個(gè)item(position)明肮。
3.保留這兩個(gè)值,我用的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;//第幾個(gè)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);
//監(jiān)聽recyclerview的滑動(dòng)
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當(dāng)前位置
*/
private voidgetPositionAndOffset() {
LinearLayoutManager layoutManager = (LinearLayoutManager)recyclerView.getLayoutManager();
//獲取可視的第一個(gè)view
View topView = layoutManager.getChildAt(0);
if(topView !=null) {
//獲取與該view的頂部的偏移量
lastOffset= topView.getTop();
//得到該View的數(shù)組位置
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滾動(dòng)到指定位置
*/
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);
}
}
}
因?yàn)長istView有相關(guān)方法所以實(shí)現(xiàn)起來會(huì)更加方便嫂粟,而recyclerView相對(duì)代碼就多敲了一點(diǎn)而已钠右,但是也好實(shí)現(xiàn)赋元。