2016-07-14 4 views
0

アドレス帳から連絡先の名前、電子メール、フォトURIを保持するContactのPOJOクラスを持っています。アクティビティが始まると、私は連絡先に問い合わせ、すべての連絡先を取り出してArrayList<Contact>に割り当てます。このArrayListは、RecyclerViewのすべての連絡先を表示するために使用されます。finalオブジェクトは元のオブジェクトの値を変更します

ユーザーがクリックすると、警告ダイアログとユーザーの名前とメールを表示したポップアップが開き、EditTextと表示されます。ユーザーは詳細を編集して保存することができます。それが保存されると、Contactオブジェクトが選択された連絡先リストの別のArrayListに追加されます。

問題は、連絡先情報を編集して保存するときに発生します。また、すべての連絡先の元の連絡先の詳細が変更されますArrayList

コードフロー:データが格納されている

のArrayList:

ArrayList<Contact> mContacts = new ArrayList<>(); // This is filled with contact data 
ArrayList<Contact> mSelectedContacts = new ArrayList<>(); // Initially empty 

コンタクトをユーザーがクリック、編集連絡先の詳細のポップアップショー:作成

@Override 
    public void onBindViewHolder(ContactViewHolder contactViewHolder, final int position) { 

     // Get the contact details at given position 
     final Contact ci = contactList.get(position); 

     ... 

     contactViewHolder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       createNameEmailEditDialog(ci); // Opens Popup 
      } 
     }); 

    } 

方法ポップアップ:

private void createNameEmailEditDialog(final Contact contact) { 

     final AlertDialog.Builder alert = new AlertDialog.Builder(this); 

     ... 

     dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

        contact.setName(String.valueOf(nameEditText.getText())); 
        contact.setEmail(String.valueOf(emailEditText.getText())); 
        mSelectedContacts.add(contact); 
        dialog.dismiss(); 
        addViewToSeletedBar(contact); 
      } 
     }); 
    } 

ダイアログが消滅した後、RecyclerViewリストに表示されます。私は、編集された名前もすべての連絡先リスト(mContacts ArrayList)に反映されていることがわかります。

ハードリファレンスが行われていますが、どこにあるのですか?ハードリファレンスを提供するのはfinalですか?またはfinal Contact cicreateNameEmailEditDialog()と呼んでいると損傷の原因になりますか?それとも何か?

どうすればいいですか?

答えて

2

参照contactfinalです。これは参照が他のものを指し示すことができないことを意味します。しかし、contactインスタンス自体はは不変ではありません。参照タイプfinalは、immutableではありません。 contactの防御的なコピーを作成して、元のインスタンスを変更したくない場合は、メソッドに渡してみてください。

+0

答えをいただきありがとうございます。防御的なコピーという用語は何を意味しますか? – kirtan403

+2

@ kirtan403コンストラクタ 'Contact(Contact c)'を作成し、そこで 'List'から取得した' Contact'を渡します。このコンストラクタでは、他の 'Contact'から値を取得して設定するだけです。 – SomeJavaGuy

+1

@ kirtan403 - チェックhttp://stackoverflow.com/questions/15020850/copy-constructors-and-defensive-copying – TheLostMind

関連する問題