我有一个活动,它通过RecyclerView显示项目列表。当我点击一个项目时,它会转到另一个活动来显示它。问题是:当我按下操作栏上的后退按钮时,它会将我带回到RecyclerView,但不会在同一滚动位置(它会开始(。
到目前为止我尝试了什么?
-
我创建了onPause和onResume方法,以便在按下返回键按钮时返回到相同的滚动位置-失败
-
我在某个地方读到了可以通过以下方式实现的内容:
实现";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 上安全地执行