安卓系统:通过操作栏上的后退按钮返回到相同的滚动位置



我有一个活动,它通过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);
}}

我需要改变什么?谢谢

您必须使用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 上安全地执行

最新更新