保留当前RecyclerView在跳转前的滑动位置

在开发过程中有的时候需要保留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相对代码就多敲了一点而已,但是也好实现。

你可能感兴趣的:(保留当前RecyclerView在跳转前的滑动位置)