Почему мой реселлер ViewView не сохраняет свое состояние? - PullRequest
0 голосов
/ 13 марта 2020

Мой 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 , но ни один, кажется, не работает. Любые отзывы приветствуются.

...