使用SharedPreferences保存ArrayList时,会再次添加以前添加的项目

时间:2014-01-06 05:36:10

标签: android android-listview arraylist sharedpreferences

在我的应用程序中,我有3个活动A,B和C.在活动A中按下按钮时,它启动活动B,并使用putExtra将空的arraylist传递给它。在活动B中,如果arraylist为空,则启动Activity C,它在ArrayList中添加一个项目并将其传递给Activity B.然后显示Activity B和arraylist。在活动B中有一个“后退”按钮,当按下时会重新启动活动A.在活动A中,显示arraylist中的项目数,当按下EditText时,启动活动B.活动B现在显示项目中的项目。 ArrayList,因为ArrayList不为空。这很好但有些奇怪的事情发生了。当在ArrayList中显示项目时,先前的项目将以某种方式再次添加。如果ArrayList有1个项目,它可以正常工作。但是当添加2个或更多时,某些项目会被添加多次,并且可以是任意随机数。当我在活动A和B之间旅行时,大小不断增加。

以下是我的代码的一部分: 在活动A:

此处活动B在单击按钮btn_rec时启动。

btn_rec = (ImageButton) findViewById(R.id.btn_rec);
    btn_rec.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Intent rec_Intent = new Intent(FlipCardActivity.this,
                    RecipientsActivity.class);
            rec_Intent.putExtra("RecArray", RecipientArray);
            startActivityForResult(rec_Intent, NO_OF_RECIPIENTS);

        }
    });

EditText显示ArrayList中的项目数,单击时启动活动B.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {     
    super.onActivityResult(requestCode, resultCode, data);
if (requestCode == NO_OF_RECIPIENTS && resultCode == RESULT_OK) {
        RecipientArray = (ArrayList<Person>) data.getSerializableExtra("RecArray");

        if (RecipientArray.size() > 0) {
edt_rec.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    Log.e("In edt onclick", "Hello");
                    if (RecipientArray.size() == 0) {
                        Intent new_rec_Intent = new Intent(
                                FlipCardActivity.this,
                                RecipientAddressActivity.class);
                        startActivity(new_rec_Intent);
                    } else {
                        Intent rec_Intent = new Intent(
                                FlipCardActivity.this,
                                RecipientsActivity.class);
                        rec_Intent.putExtra("RecArray", RecipientArray);
                        startActivityForResult(rec_Intent, NO_OF_RECIPIENTS);
                    }

                }
            });
        }

    }
}
当ArrayList的大小为&gt; 0时,

EditText启动活动B,否则启动活动C. 在活动B中:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    RecipientArray = (ArrayList<Person>) getIntent().getSerializableExtra(
            "RecArray");

    Log.e("Recipient Array", "size = " + RecipientArray.size());
    if (RecipientArray.size() == 0) {
        Intent rec_addr_Intent = new Intent(RecipientsActivity.this,
                RecipientAddressActivity.class);
        rec_addr_Intent.putExtra("RecArray", RecipientArray);
        startActivityForResult(rec_addr_Intent, REC_INFO);
    } else {

        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(this.getApplicationContext());
        int size = prefs.getInt("size", 0);
        for (int i = 0; i < size; i++) {
            String json = prefs.getString("RecList_" + i, "");
            Gson gson = new Gson();
            Person p = gson.fromJson(json, Person.class);
            RecipientArray.add(p);
        }
        // Log.e("RecListActivity","Size of arraylist"+RecipientArray.size());


        this.m_adapter = new CustomListAdapter(RecipientsActivity.this,
                R.layout.recipients_list, RecipientArray);

    }

    setContentView(R.layout.activity_recipients);
    list = (ListView) findViewById(R.id.rec_list);
    list.setAdapter(m_adapter);
    addListenerForButtons();
}

protected void onPause() {      
    super.onPause();
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(this.getApplicationContext());
    Editor editor = prefs.edit();
    Gson gson = new Gson();
    // String json = gson.toJson(RecipientArray);
    for (int i = 0; i < RecipientArray.size(); i++) {
        String json = gson.toJson(RecipientArray.get(i));
        editor.putString("RecList_" + i, json);
        editor.putInt("size", i);
    }

    editor.apply();
}

在onPause中保存ArrayList的值。

ArrayList是'RecipientArray',其中包含'Person'类型的对象。 请帮助我尽快解决这个问题。如果需要更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

之前的评论:

您不应在变量名称的开头使用大写字母。这很令人困惑,因为它看起来像一个类名,而且它可能会让你遇到麻烦。您应该在任何地方将RecipientArray重命名为recipientArray。

让我们解决您的问题。

我不确定我是否理解您的代码,但我能看到的内容(请查看我的代码:)

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //here you retrieve the array coming from Activity A

            RecipientArray = (ArrayList<Person>) getIntent().getSerializableExtra(
            "RecArray");
    if (RecipientArray.size() == 0) {
               ///...
    } else {
        //here, you add to the array, all the preferences from the array
        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(this.getApplicationContext());
        int size = prefs.getInt("size", 0);
        for (int i = 0; i < size; i++) {
            String json = prefs.getString("RecList_" + i, "");
            Gson gson = new Gson();
            Person p = gson.fromJson(json, Person.class);
            RecipientArray.add(p);
        }
        // ...
    }
}

//here, when the activity is going to be closed, you save all the items in the array to the sharedpreferences
protected void onPause() {      
    super.onPause();
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(this.getApplicationContext());
    Editor editor = prefs.edit();
    Gson gson = new Gson();
    // String json = gson.toJson(RecipientArray);
    for (int i = 0; i < RecipientArray.size(); i++) {
        String json = gson.toJson(RecipientArray.get(i));
        editor.putString("RecList_" + i, json);
        editor.putInt("size", i);
    }

    editor.apply();
}

所以你在做什么,

  1. 从A到B:您传递数组并在已保存的首选项中添加元素。
  2. 从B到A:将所有元素保存到共享首选项(现在您拥有来自A的数组中的元素,以及来自共享首选项的先前元素,因此您的共享首选项更大)
  3. 从A到B:你再次传递数组,并添加来自更大的共享偏好的元素,正如我们在第2点中看到的那样,已经包含了所有元素,也就是那些构成数组的元素,所以你要复制它们。
  4. 所以考虑一下你需要什么,可能你不必在A和B之间传递数组,或者你不必将它保存到共享首选项,或者你必须检查你保存了哪些项目。考虑一下你真正需要的是什么,问题出在那些方面