2016-05-20 13 views
0

Ich versuche, meine Listview-Elemente mit SharedPreferences zu speichern. Ich habe es etwas geschafft, Elemente in der Listenansicht zu speichern und zu laden. Ich kann Elemente hinzufügen, aber wenn ich die Listenansicht nach dem Schließen lade, wird nur das zuletzt hinzugefügte Element gespeichert. Jede Hilfe wäre willkommen, danke!Speichern und Laden von Listview-Daten mit SharedPreferences

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(); 
} 
+1

Versuche versuchen SQLite am besten zu verwenden, um große Datenspeicher –

Antwort

3

Sie versuchen, alle angeklickten Elemente in einem SharedPreferens- Repository zu speichern. Versuchen Sie, den Namen zu ändern, wenn Sie den Wert in SharedPreferences speichern - zum Beispiel SavePreferences (item.getName(), item); Die Methode item.getName gibt einen eindeutigen Namen für dieses Element zurück. Aber ist ein schlechter Weg. Gute Möglichkeit ist, mehrere Daten in der Datenbank zu speichern.

+1

ja 'SQLite' Lösung ist und' SharedPreferences' für kleines und temprory Datum seiner gute Option. – Hosseini

1

Dies passiert, weil jedes Mal, wenn der Benutzer ein Element aus der Liste auswählt, das vorherige in den Einstellungen gespeicherte Element durch das neue Element ersetzt wird, da jedes Element mit demselben Schlüssel gespeichert wird.

Sie können so etwas wie diese

//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(); 
    } 
} 
Verwandte Themen