使用带有SavePreferences的JSONArray从ListView保存数据

时间:2013-06-27 21:27:22

标签: android listview

我对Android的编码很新。我尝试使用SavePreferences来保存ListView的用户输入数据。然而,这种方法导致只保存用户输入的最后一项,而不是整个ListView。(我认为这是因为我覆盖了密钥,因此它只显示最后一个值)

然后有人建议我应该使用JSONArray,但我无法理解发生了什么。

使用JSONArray的我的代码如下: 注意:JSONArray上有一堆错误,因为我不认为我使用了正确的密钥。

public class TaskPage extends SherlockActivity {

EditText display;
ListView lv;
ArrayAdapter<String> adapter;
Button addButton;
ArrayList<String> dataSetarrlist = new ArrayList<String>();



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    display = (EditText) findViewById(R.id.editText1);
    lv = (ListView) findViewById(R.id.listView1);
    addButton = (Button) findViewById(R.id.button1);

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice);
    lv.setAdapter(adapter);


    LoadPreferences();




    // setChoiceMode places the checkbox next to the listviews



    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String task = display.getText().toString();


                adapter.add(task);
                adapter.notifyDataSetChanged();



                SavePreferences("LISTS", task);
        }
    });
}

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

    SharedPreferences.Editor editor = data.edit();
    editor.putString(key, value);
    editor.commit();


}

protected void LoadPreferences(){
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);

    JSONArray dataSet1 = new JSONArray(data.getString("LISTS", "None Available"));
    for(int i = 0; i<dataSet1.length(); i++)
         adapter.add(dataSet1.getString(i));
         adapter.notifyDataSetChanged();

    adapter = new ArrayAdapter<String>(this, 
                         android.R.layout.simple_list_item_multiple_choice,dataSetarrlist);
    lv.setAdapter(adapter);


    // setChoiceMode places the checkbox next to the listviews
}

我很困惑,所以有人可以告诉我哪里出错了,并提供一些示例代码。我几乎可以肯定这是因为我没有正确使用密钥和值来保存数据,但我似乎无法正确 最后,是否有另一种方法,我不必使用JSONArray,以便它仍然显示列表视图中的所有用户输入。

编辑代码如下

addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String task = display.getText().toString();


                adapter.add(task);
                dataSetarrlist.add(task);   
                adapter.notifyDataSetChanged();
                SavePreferences("LISTS", dataSetarrlist.toString());
        }
    });
}

protected void SavePreferences(String key, String value) {
    // TODO Auto-generated method stub
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = data.edit();  
    editor.putString("LISTS", dataSetarrlist.toString());
    editor.commit();


}

protected void LoadPreferences(){
    SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
    String dataSet = data.getString("LISTS", dataSetarrlist.toString());

    ArrayList<String> dataSetarrlist = new ArrayList<String>();
    dataSetarrlist.add(dataSet);
    adapter = new ArrayAdapter<String>(this, 
                         android.R.layout.simple_list_item_multiple_choice,dataSetarrlist);
    lv.setAdapter(adapter);
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);



    // setChoiceMode places the checkbox next to the listviews
}

1 个答案:

答案 0 :(得分:0)

您的TextView(显示)仅包含1个值。在addButton的OnClickListener上,你应该在你的数组&amp;上添加“task”。将数组传递给SavePreferences而不是“task”:

addButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        String task = display.getText().toString();
        adapter.add(task);
        dataSetarrlist.add(task);
        adapter.notifyDataSetChanged();
        SavePreferences("LISTS", dataSetarrlist);
    }
});
}

您应该修改SavePreferences以处理ArrayList。