アドレス帳から連絡先の名前、電子メール、フォト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 ci
でcreateNameEmailEditDialog()
と呼んでいると損傷の原因になりますか?それとも何か?
どうすればいいですか?
答えをいただきありがとうございます。防御的なコピーという用語は何を意味しますか? – kirtan403
@ kirtan403コンストラクタ 'Contact(Contact c)'を作成し、そこで 'List'から取得した' Contact'を渡します。このコンストラクタでは、他の 'Contact'から値を取得して設定するだけです。 – SomeJavaGuy
@ kirtan403 - チェックhttp://stackoverflow.com/questions/15020850/copy-constructors-and-defensive-copying – TheLostMind