1

I know this question has already been asked a lot, but I don't get why onSaveInstanceState isn't working for me. It's probably something stupid, but I hope some of you can help me out here.. Anyways, this is my code:

public class Main extends Activity implements OnClickListener, OnKeyListener {

EditText textitem;
Button buttonadd;
ListView listitems;

ArrayList<String> ToDo;
ArrayAdapter<String> AA;
ArrayList<String> MyArrayList;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    textitem = (EditText) findViewById(R.id.textitem);
    buttonadd = (Button) findViewById(R.id.buttonadd);
    listitems = (ListView) findViewById(R.id.listitems);

    buttonadd.setOnClickListener(this);
    textitem.setOnKeyListener(this);

    ToDo = new ArrayList<String>();
    AA = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, ToDo);
    listitems.setAdapter(AA);

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putStringArrayList("MyArrayList", ToDo);
    super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    ArrayList<String> ToDo = savedInstanceState.getStringArrayList("MyArrayList");
}

private void addItem(String item) {
    if (item.length() > 0) {
        this.ToDo.add(item);
        this.AA.notifyDataSetChanged();
        this.textitem.setText("");
    }
}

public void onClick(View v) {
    if (v == this.buttonadd) {
        this.addItem(this.textitem.getText().toString());
    }
}

public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN
            && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
        this.addItem(this.textitem.getText().toString());
    }
    return false;
}

}

Zero
  • 1,864
  • 3
  • 21
  • 39

4 Answers4

0

you are saving that in the local variable why ? may try this

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    this.ToDo = savedInstanceState.getStringArrayList("MyArrayList");
}

Usually you restore your state in onCreate. It is possible to restore it in onRestoreInstanceState as well, but not very common. (onRestoreInstanceState is called after onStart, whereas onCreate is called before onStart.

from : onSaveInstanceState () and onRestoreInstanceState ()

Community
  • 1
  • 1
Dheeresh Singh
  • 15,643
  • 3
  • 38
  • 36
0

You're extracting the saved values in the "onRestoreInstanceState()" callback, but you don't actually do anything with them.

ArrayList<String> ToDo = savedInstanceState.getStringArrayList("MyArrayList");

You need to wrap these values in an adapter and assign it to the list, like you do it in the end of onCreate().

Zsombor Erdődy-Nagy
  • 16,864
  • 16
  • 76
  • 101
0
public class Main extends Activity implements OnClickListener, OnKeyListener {

EditText textitem;
Button buttonadd;
ListView listitems;

ArrayList<String> ToDo;
ArrayAdapter<String> AA;
ArrayList<String> MyArrayList;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    textitem = (EditText) findViewById(R.id.textitem);
    buttonadd = (Button) findViewById(R.id.buttonadd);
    listitems = (ListView) findViewById(R.id.listitems);

    buttonadd.setOnClickListener(this);
    textitem.setOnKeyListener(this);

    if(savedInstanceState!=null)
     {
       ToDo = savedInstanceState.getStringArrayList("MyArrayList");
     }
    else
     {
       ToDo = new ArrayList<String>();
     }
    AA = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, ToDo);
    listitems.setAdapter(AA);

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putStringArrayList("MyArrayList", ToDo);
    super.onSaveInstanceState(savedInstanceState);
}


private void addItem(String item) {
    if (item.length() > 0) {
        this.ToDo.add(item);
        this.AA.notifyDataSetChanged();
        this.textitem.setText("");
    }
}

public void onClick(View v) {
    if (v == this.buttonadd) {
        this.addItem(this.textitem.getText().toString());
    }
}

public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN
            && keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
        this.addItem(this.textitem.getText().toString());
    }
    return false;
}

Hope this will help you. Vipul

Vipul
  • 27,808
  • 7
  • 60
  • 75
  • Thank you very much for your response, I have implemented your solution but it still doesn't seem to work. If I add some tasks, press "home", and open the application again it remembers the state, but this is onPause. If I actually close the application by hitting the back button, and open it again, the list is empty. Do you know why this could be? – Zero May 30 '12 at 09:56
0

the Bundle which you setting in onSaveInstanceState is only available when the android OS is trying to restore your activity either because the device configuration has changed like device orientation or the app was kill when in background by the OS