当然我知道这个错误意味着什么,但我不知道如何删除它。 现在我正在尝试
private void removeFriendFromList() {
List<Friend> copy = new ArrayList<Friend>(globalSearchFriends);
for (Friend friend : globalSearchFriends) {
if (friend.equals(remove)) {
copy.remove(friend);
}
}
}
但这不起作用。 这是我的全球主义者
private List<Friend> globalSearchFriends = new ArrayList<>();
我正在尝试迭代,但它没有用,或者我做了一件坏事。
此外我需要在这里使用它:我在api中搜索朋友,这就像我在EditText中输入文本然后在我的适配器中看到那个用户,但是这项工作仅适用于少数成员,总是当我搜索“安德鲁”然后我搜索“youko”我得到错误。
private void serachFriend(final String query) {
etGlobalSearch.addTextChangedListener(new TextWatcherAdapter() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
FindFriend request = new FindFriend();
request.query = query;
request.query = s.toString().toLowerCase().trim();
backend.findFriend(request).enqueue(new Callback<ResponseFindFriend>() {
@Override
public void onResponse(Call<ResponseFindFriend> call, Response<ResponseFindFriend> response) {
synchronized (globalSearchFriends) {
globalSearchFriends.clear();
removeFriendFromList();
try {
if (response == null)
throw new Exception();
if (!response.isSuccessful())
throw new Exception();
if (response.body() == null)
throw new Exception();
if (response.body().results == null)
throw new Exception();
globalSearchFriends = response.body().results;
} catch (Exception e) {
Log.d("Blad", "sobie");
} finally {
gatherResults();
}
}
}
@Override
public void onFailure(Call<ResponseFindFriend> call, Throwable t) {
synchronized (globalSearchFriends) {
globalSearchFriends.clear();
removeFriendFromList();
gatherResults();
}
}
});
}
});
}
private void removeFriendFromList() {
List<Friend> copy = new ArrayList<Friend>(globalSearchFriends);
for (Friend friend : globalSearchFriends) {
if (friend.equals(remove)) {
copy.remove(friend);
}
}
}
private void gatherResults() {
removeFriendFromList();
for (Friend f : globalSearchFriends)
globalSearchFriends.add(f);
findedFriendsAdapter.setFriendList(globalSearchFriends);
}
任何有关的帮助,祝你有愉快的一天! :)
编辑 我在这个案子上得到了错误。
java.util.ConcurrentModificationException
for (Friend f : globalSearchFriends)
globalSearchFriends.add(f);
findedFriendsAdapter.setFriendList(globalSearchFriends);
在日志上我有:
at java.util.ArrayList$ArrayListIterator.next
答案 0 :(得分:2)
这听起来很可疑:
globalSearchFriends
您尝试在迭代时将ArrayList
的内容添加到自身,ConcurrentModificationException
不允许这样做,因此会导致remove
。确实ArrayList#iterator()
会返回fail-fast iterator,这意味着:
如果列表在迭代器之后 结构修改 除了通过迭代器自己的
add
或ConcurrentModificationException
外,以任何方式创建 方法,迭代器将抛出globalSearchFriends.addAll(globalSearchFriends); // or globalSearchFriends.addAll(new ArrayList<>(globalSearchFriends)); for safety findedFriendsAdapter.setFriendList(globalSearchFriends);
。
它听起来不像是正常/预期的行为,但如果你真的想要复制列表的内容,只需使用addAll(Collection<? extends E> c)
而不是迭代为下一个:
ArrayList
NB: addAll(Collection<? extends E> c)
不是线程安全的,因此当且仅当列表未共享或受到保护时,请确保在列表中调用{{1}}显式或内在锁定,否则您将获得不可预测的行为。
答案 1 :(得分:0)
CopyOnWrite Collection怎么样?
META.permissions
输出 list = [0,1,2,3,4,5,6,7,8,9,0,200,400,600,800]
答案 2 :(得分:0)
尝试以下
private void removeFriendFromList() {
List<Friend> copy = new ArrayList<Friend>(globalSearchFriends);
Friend targetToRemove = null;
for (Friend friend : globalSearchFriends) {
if (friend.equals(remove)) {
targetToRemove = friend;
}
}
if (targetToRemove != null) {
copy.remove(targetToRemove);
}
}