Мой recyclerView не сохраняется (или не загружается) после того, как я вызываю state.putParcelable (и state.getParcelable), как показано ниже.
Вот моя MainActivity (Java в android -studio):
package com.example.forumscratch;
import android.content.Context;
import android.os.Bundle;
import com.google.android.material.textfield.TextInputEditText;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Parcelable;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
String THIS_TAG = "MainActivity";
InputMethodManager imm;
private TextInputEditText userInput;
private ArrayList<String> list_ordered = new ArrayList<>();
MyRecyclerViewAdapter adapter;
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
private final String KEY_RECYCLER_STATE = "recycler_state";
private static Bundle mBundleRecyclerViewState;
Parcelable mListState;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
userInput = findViewById(R.id.userInput1_Edit);
userInput.setOnEditorActionListener(editorActionListener);
//set up recyclerView
recyclerView = findViewById(R.id.rvAnimals);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyRecyclerViewAdapter(this, list_ordered);
recyclerView.setAdapter(adapter);
layoutManager = recyclerView.getLayoutManager();
// loadData();
if(savedInstanceState != null) { //I've been switching between this and loadData(), but neither seem to work.
Parcelable savedRecyclerLayoutState = savedInstanceState.getParcelable(KEY_RECYCLER_STATE);
recyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerLayoutState);
}
}
private TextView.OnEditorActionListener editorActionListener = new TextView.OnEditorActionListener() { //checks when enter is pressed
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_ACTION_SEND) {
if(!userInput.getText().toString().isEmpty()) addItem(v);
}
return true;
}
};
void addItem(View view) { //adds checkbox and updates adapter
String itemText = userInput.getText().toString();
list_ordered.add(itemText);
adapter.notifyItemInserted(list_ordered.size() - 1);
userInput.setText("", TextView.BufferType.EDITABLE); //reset
}
@Override
protected void onSaveInstanceState(Bundle state) { //I've tried switching between this and saveData() in onPause(), but neither seem to work
super.onSaveInstanceState(state);
Log.d(THIS_TAG, "onSaveInstanceState called");
// Save list state
mListState = layoutManager.onSaveInstanceState();
state.putParcelable(KEY_RECYCLER_STATE, mListState);
}
@Override
protected void onRestoreInstanceState(Bundle state) { //this is never called
super.onRestoreInstanceState(state);
Log.d(THIS_TAG, "onRestoreInstanceState called");
// Retrieve list state and list/item positions
mListState = state.getParcelable(KEY_RECYCLER_STATE);
layoutManager.onRestoreInstanceState(mListState);
}
@Override
protected void onPause() {
super.onPause();
Log.v(THIS_TAG,"onPause called");
//saveData();
}
@Override
protected void onResume() {
super.onResume();
Log.v(THIS_TAG,"onResume called");
//loadData();
}
void saveData() {
Log.v(THIS_TAG,"Save Data");
mBundleRecyclerViewState = new Bundle();
Parcelable listState = layoutManager.onSaveInstanceState();
mBundleRecyclerViewState.putParcelable(KEY_RECYCLER_STATE, listState);
}
void loadData() {
Log.v(THIS_TAG,"Load Data");
if (mBundleRecyclerViewState != null) { //always seems to be null, so it's never called
Parcelable listState = mBundleRecyclerViewState.getParcelable(KEY_RECYCLER_STATE);
layoutManager.onRestoreInstanceState(listState);
}
}
}
Я прошел через все форумы без удачи. Я пытался использовать saveData () и loadData () в onResume () и onPause () вместо кода в onSaveInstanceState , но ни один, кажется, не работает. Любые отзывы приветствуются.