【问题标题】:Android: Returning to same scroll position via back button on Action BarAndroid:通过操作栏上的后退按钮返回到相同的滚动位置
【发布时间】:2022-01-10 02:50:25
【问题描述】:

我有一个通过 RecyclerView 显示项目列表的活动。 当我单击一个项目时,它会转到另一个活动来显示它。 问题是:当我按下操作栏上的后退按钮时,它会将我带回 RecyclerView 但不在相同的滚动位置(它需要开始)。

到目前为止我尝试了什么?

  1. 我创建了 onPause 和 onResume 方法,以便在我按下返回键按钮时返回到相同的滚动位置 - 失败

  2. 我在某处读到,我可以通过以下方式实现它:

    实现“androidx.recyclerview:recyclerview:1.3.0-alpha01”

然后:

mAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);

它也失败了。 这是我的全班:

public class ItemsActivity extends AppCompatActivity{

private RecyclerView mRecyclerView;
private ImageAdapter mAdapter;
private FirebaseStorage mStorage;
private DatabaseReference mDatabaseRef;
private ValueEventListener mDBListener;
private List<Item> mItem;


Parcelable state;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_items);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);


    mRecyclerView=findViewById(R.id.mRecyclerView);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));  //this was alone


    mItem=new ArrayList<>();
    mAdapter=new ImageAdapter(ItemsActivity.this,mItem);
    mAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY);  //added
    mRecyclerView.setAdapter(mAdapter);

    mStorage=FirebaseStorage.getInstance();
    mDatabaseRef= FirebaseDatabase.getInstance().getReference("Item");
    mDBListener = mDatabaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            mItem.clear();
            for(DataSnapshot postSnapshot: snapshot.getChildren()){
                Item item = postSnapshot.getValue(Item.class);
                item.setKey(postSnapshot.getKey());
                mItem.add(item);
            }
            Collections.reverse(mItem);     
            mAdapter.notifyDataSetChanged();
        }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Toast.makeText(ItemsActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
protected void onPause() {

    state = mRecyclerView.getLayoutManager().onSaveInstanceState();
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    mRecyclerView.getLayoutManager().onRestoreInstanceState(state);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mDatabaseRef.removeEventListener(mDBListener);
}}

我需要改变什么?谢谢!

【问题讨论】:

    标签: android android-recyclerview scroll android-actionbar position


    【解决方案1】:

    您必须使用onSaveInstanceState(Bundle state)onRestoreInstanceState(Bundle state)

    布局管理器负责处理存储状态并恢复它。

    protected void onSaveInstanceState(Bundle state) {
         super.onSaveInstanceState(state);
    
         // Save list state
         mListState = mLayoutManager.onSaveInstanceState();
         state.putParcelable(LIST_STATE_KEY, mListState);
    }
    
    protected void onRestoreInstanceState(Bundle state) {
        super.onRestoreInstanceState(state);
    
        // Retrieve list state and list/item positions
        if(state != null)
            mListState = state.getParcelable(LIST_STATE_KEY);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    
        if (mListState != null) {
            mLayoutManager.onRestoreInstanceState(mListState);
        }
    }
    

    PS:在活动中而不是onRestoreInstanceState,你可以安全地在onActivityCreated上做

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多