Dingus
Dingus

Reputation: 1

Saving and loading listview data using SharedPreferences

I am trying to save my listview items using SharedPreferences. I have somewhat managed to save and load items in the listview. I can add items to it, but when I load the listview after closing it, only the most recent added item is saved. Any help would be appreciated, thanks!

private EditText editTxt;
private ListView list;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;
private String item;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    editTxt = (EditText) findViewById(R.id.editText);
    list = (ListView) findViewById(R.id.List);
    arrayList = new ArrayList<String>();

    adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.list_item, arrayList);
    list.setAdapter(adapter);
    //load data here
    LoadPreferences();
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

    FloatingActionButton add = (FloatingActionButton) findViewById(R.id.add);
    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (editTxt.getText().toString().length() == 0) {
                Toast.makeText(MainActivity.this, "Please enter something into the text box",
                        Toast.LENGTH_SHORT).show();
            } else {
                item = editTxt.getText().toString();
                arrayList.add(item);
                adapter.notifyDataSetChanged();
                //save data here
                SavePreferences("List", item);
                editTxt.setText("");
            }
        }
    });
}

//save listview data
protected void SavePreferences(String key, String value) {
    // TODO Auto-generated method stub
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = data.edit();
    editor.putString(key, value);
    editor.commit();
}
//load listview data
protected void LoadPreferences(){
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
    String dataSet = data.getString("List", "Add an item...");

    adapter.add(dataSet);
    adapter.notifyDataSetChanged();
}

Upvotes: 0

Views: 1317

Answers (2)

Aradhna
Aradhna

Reputation: 983

This is happening because each time the user selects an item from the list, the previous item stored in Preferences is being replaced by the new item since every item is being stored with the same key.

You can try something like this

//save listview data
protected void SavePreferences(String key, String value) {
    // TODO Auto-generated method stub
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);

    String s=data.getString(key,""); //to fetch previous stored values

     s=s+"!"+value;   //to add new value to previous one

   data.edit().putString(key,s).commit();
}


//load listview data
protected void LoadPreferences(){
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
    String dataSet = data.getString("List", "Add an item...");

     if(dataSet.contains("!")){ //to check if previous items are there or not

     String rows[]=dataSet.split("!"); //to get individual rows of list

      for(int i=0;i<rows.length;i++){
       adapter.add(rows[i);   //to add each value to the list
       adapter.notifyDataSetChanged();
     }
 } else{
        adapter.add(dataSet);   
       adapter.notifyDataSetChanged();
  }
}

Upvotes: 1

Konstantin
Konstantin

Reputation: 184

You try to save all of clicked items in one SharedPreferences repository. try to change name when save value to SharedPreferences - for example SavePreferences(item.getName(), item); where item.getName method return unique name for this item. But is a bad way. Good way is store multiple data in database.

Upvotes: 3

Related Questions