使用Intent从第二个Activity返回到第一个Activty时,如何保存RecyclerView的最后一个项目位置

时间:2017-08-31 00:14:58

标签: android android-recyclerview

我尝试了很多可能的解决方案,但它们没有用,只是我不想使用onBackPressed来实现这一点,我试图回到之前的Activity使用Intent,我尝试使用putExtra()传递位置并从上一个Activity中的intent获取位置并使用recycleView.scrollToPosition(pos);,但是重新创建了Activity并且滚动不起作用,我也尝试使用onSavedInstanceState()onRestoreInstanceState,但我得到了相同的结果,任何人都可以给我一个想法?提前谢谢。

我也想知道为什么下面的方法不起作用?

@Override
protected void onPause() {
    super.onPause();
    lastFirstVisiblePosition = ((LinearLayoutManager) 
    recyclerView.getLayoutManager()).findLastVisibleItemPosition();
    Log.d("bePos", String.valueOf(lastFirstVisiblePosition));
}

@Override
protected void onResume() {
    super.onResume();
    Log.d("lastPos", String.valueOf(lastFirstVisiblePosition));
    recyclerView.scrollToPosition(lastFirstVisiblePosition);
}

更新 我解决了保存最后一个位置的问题,但后来发现我无法滚动到RecyclerView中的那个位置,因为我正在使用分页RecyclerView只是无法滚动到适配器尚未加载的项目,那么如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

在onSaveInstanceState方法或首选项中保存最后一个可见位置,如果您希望在从正在运行的任务中清除应用程序(已终止)后检索它。我正在展示以下两种方法:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //this is when your activity is not permanent
        outState.putInt("last_position", lastFirstVisiblePosition);
        //save permanently
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        preferences.edit().putInt("last_position", lastFirstVisiblePosition).apply();
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        //retrieve your stored item
        lastFirstVisiblePosition = savedInstanceState.getInt("last_position");
        //retrieve any time except your first run
        //you can add these lines in the onResume if you used the preference method
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        //use 0 as default
        lastFirstVisiblePosition = preferences.getInt("last_position", 0);
    }

我更喜欢偏好方法以获得更好的持久性,即使你的任务被杀死,你仍然可以检索它。

答案 1 :(得分:0)

这种方法帮助我获得了最后职位。只需在 onBindViewHolder

中的 RecyclerView 中添加此行代码
holder.setIsRecyclable(false);