2016-01-23 74 views
0

场景: 我有四个edittext和三个按钮,其中,当用户在其中一个edittext中提供某些输入并单击按钮1或按钮2时,提供的应该将用户输入保存在与按钮3相关联的活动中。通常,按钮3活动存储由用户提供的输入的“历史”。Android:使用SharedPreferences将多个EditText值存储到ListView中

目前,我使用的是sharedpreferences方法,我知道如果你想存储多个值,这不是一个好方法。我已经尝试使用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(); 
    } 
} 
} 

我现在面临的问题是,我只看到一个列表视图与显示只有1值,它是明显的,因为没有代码,做增量。当我输入一个新值时,旧值会被覆盖。由于有两个与saveHistory方法相关的按钮,我只能得到一个值,因为只有一个listview。所以我的需求是我想要使用sharedpreferences存储多个值,同时单击这两个按钮应该保存这些值并且不会覆盖彼此的值。我知道我问的太多了,但如果你能帮助我找出如何正确地使用这个场景和这个代码做增量,那么我会很感激。

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

+0

如果我正确理解您的意思,只需在调用thr save changes函数时检索先前的共享偏好即可。检查textview是否包含字符串,然后将其保存到首选项。现在,您可以在不检查以前的值的情况下设置新值和空值。并且确实丢失了一切 – Riddim

+0

为什么不能用sql Lite DB来尝试。这将是非常有用的。 –

回答

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

编辑:对不起,我想,我现在明白你的问题。

您可以使用单个SharedPreferences密钥与PutStringSet()一起存储多个字符串值。您需要确认哪个按钮正在调用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。

+0

我的代码片段没有错,我只是在发布问题时忘了做一些更改,我将立即编辑该问题,谢谢指出。 – Neel0507

+0

现在你在同一个作用域中使用相同名称放置多个变量:String et1 = et1.getText()。toString();' –

+0

那么,第一个字符串et1(String et1 =)是一个新字符串,它被分配给一个自动完成文本视图,所以第二个et1是一个自动完成文本视图,因此两个et1都不相同,et2,et3和et4也是如此。我会考虑你编辑的答案,并将在我的应用程序中进行测试。谢谢。 – Neel0507

相关问题