我有一个名为User的Singleton类,这个用户有一个ArrayList。 现在我有一个显示用户元素的ListView,选择它们,然后按下一个按钮,它将删除所选元素; 在这种情况下:
view.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
view.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
ArrayList<Chat> elementsToErase= new ArrayList<Chat>();
@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int i, long l, boolean b) {
if(b) {
elementsToErase.add((Chat)view.getItemAtPosition(i));
}
else{
elementsToErase.remove((Chat)view.getItemAtPosition(i));
}
}
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
MenuInflater inflater = actionMode.getMenuInflater();
inflater.inflate(R.menu.menu_chat_edit, menu);
view.setSelected(true);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.delete_chat:
Arraylist<Chat> userElement = User.getIstance().getChats();
for (int i = 0; i < elementsToRemove.size(); ++i) {
userElement.removeChat(elementsToRemove.get(i));
}
adapter.notifyDataSetChanged();
actionMode.finish();
return true;
default:
return false;
}
}
删除之前,如果我创建一个新的聊天并尝试添加一些文本,它的工作原理。 删除后,如果我创建新聊天并尝试添加一些文本,则不会添加文本。
这是我从ArrayList中删除元素的方法:
for(int i = 0 ; i < chats.size();++i){
if(chats.get(i).equals(chat)) {
return chats.remove(i);
}
}
return new Chat("null",0);
}
我可能会“破坏”对User ArrayList的引用吗?
答案 0 :(得分:1)
如果您使用此:
Arraylist<Chat> userElement = User.getIstance().getChats();
userElement
和User.getIstance().getChats()
都会使用相同的下划线array
,对其中任何一个进行的修改都将反映在另一个中。
如果您想要两个不同的Objects
,请像这样创建第二个ArrayList
:
Arraylist<Chat> userElement = new ArrayList <Char>(User.getIstance().getChats());
此外,这个循环:
for(int i = 0 ; i < chats.size();++i){
if(chats.get(i).equals(chat)) {
return chats.remove(i);
}
}
将抛出ConcurrentModificationException
,如果您想在迭代时从Object
移除List
,则必须使用Iterator
。