Android:使用SharedPreferences将多个EditText值存储到ListView

时间:2016-01-23 00:09:27

标签: java android listview android-edittext sharedpreferences

方案: 我有四个edittexts和三个按钮,当用户在其中一个edittexts中提供一些输入并点击按钮1或按钮2时,用户提供的输入应该保存在与按钮3相关的活动中。一般来说,按钮3活动存储"历史"由用户提供的输入。

目前,我使用的是共享偏好方法,我知道如果你想存储多个值,这不是一个好方法。我已经尝试使用SQLite数据库解决这个问题,但我没有成功。

这是我的方法叫做" saveHistory"这是在按钮1和按钮2'中定义的。 onclick方法。

private void saveHistory()
    {
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        fd=sharedPreferences.edit();

    String et1 = et1.getText().toString();
    String et2 = et2.getText().toString();
    String et3 = et3.getText().toString();
    String et4 = et4.getText().toString();

    fd.putString("et1" , et1);
    fd.putString("et2" , et2);
    fd.putString("et3" , et3);
    fd.putString("et4" , et4);

    fd.apply();
}  

这是我的另一个类(点击按钮3,这个类被调用),它检索edittexts值。

public class history extends Activity
{
    public static final String DEFAULT = "No data";
    ListView listView; 
    SharedPreferences sharedPreferences; 
    SharedPreferences.Editor sp; 
    public ArrayAdapter<String> adapter; 

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

    listView = (ListView) findViewById(R.id.listViewMain);

    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    sp = sharedPreferences.edit();

    String et1 = sharedPreferences.getString("et1", DEFAULT);
    String et2 = sharedPreferences.getString("et2", DEFAULT);
    String et3 = sharedPreferences.getString("et3", DEFAULT);
    String et4 = sharedPreferences.getString("et4", DEFAULT);

    if (et1.equals(DEFAULT) || et2.equals(DEFAULT) || et3.equals(DEFAULT) || et4.equals(DEFAULT)) 
    {
        Toast.makeText(this, "No history found", Toast.LENGTH_LONG).show();
    }
    else
    {
        String [] values = new String[]{et1,et2,et3,et4};
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, values);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        sp.apply();
    }
}
}

我面临的问题是我只看到一个列表视图,只显示了一个值,这很明显,因为没有代码可以增加。当我输入新值时,旧值将被覆盖。因为有两个与saveHistory方法相关的按钮,我只能得到一个值,因为只有一个列表视图。所以我的需求是我想使用共享偏好存储多个值,同时单击两个按钮应该保存值而不是覆盖彼此的值。我知道我要求太多,但是如果你能帮我找到如何正确地使用这个场景和这个代码进行增量,那么我将不胜感激。

我经历了很多stackoverflow问题,其中大多数都与一个edittext和一个按钮相关联,并存储和检索这些值。但是,我的申请要求不同,因此,我发布了这个问题。

1 个答案:

答案 0 :(得分:0)

您正在检索EditTexts值,但是您在sharedPreferences中添加了其他内容。

将saveHistory()代码替换为:

private void saveHistory(){
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    fd = sharedPreferences.edit();

    String bt = et1.getText().toString();
    String an = et2.getText().toString();
    String cn = et3.getText().toString();
    String in = et4.getText().toString();

    fd.putString("et1" , bt); //These lines were the problem
    fd.putString("et2" , an); //These lines were the problem
    fd.putString("et3" , cn); //These lines were the problem
    fd.putString("et4" , in); //These lines were the problem

    fd.apply();
}

编辑:对不起,我想我现在理解你的问题了。

您可以使用PutStringSet()的单个SharedPreferences键存储多个字符串值。您需要验证调用saveHistory()的按钮,然后使用此信息创建Set

请查看以下链接以获取示例。

  

https://stackoverflow.com/a/9054240/2503185

在你的情况下,你会给(像每个EditText值):

Set<String> faveSet = faves.getStringSet("et1");
faveSet.add(button + ":" + et1_value);
SharedPreferences.Editor editor = faves.edit();
editor.putStringSet("et1", faveSet);
editor.commit();

然后检索并验证每个EditText。