我有一个常规的RecyclerView。
我的RecyclerView有一个Activity监听的监听器界面。单击RecyclerView中的项目时,将调用“onItemClick()”事件。
调用此事件时,我需要从RecyclerView中删除接下来的5个项目,然后将它们添加到Map
(Map<Integer, List<Object>>
)中。如果再次点击RecyclerView中的相同项目,我希望将5个项目重新添加到RecyclerView。
以下是我的代码在我的活动中的样子(请注意我删除了所有不相关的代码,例如onCreate()
方法等):
public class MainActivity extends AppCompatActivity implements MyAdapter.MyAdapterListener {
// The RecyclerView data
private List<Object> data = new ArrayList<>();
// The Map to keep track of all removed data
private Map<Integer, List<Object>> removedData = new HashMap<>();
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private MyAdapter myAdapter;
@Override
public void onItemClick(int position) {
Item item = (Item) data.get(position);
// Check if the Map key/value pair already exists
if (removedData.get(item.getId()) != null) {
// Key/value pair exists, re-add the 5 items into the
// RecyclerView and remove the key/value pair from the Map
List<Object> fiveItems = removedData.get(item.getId());
// Re-add the five items to the RecyclerView
data.addAll(position, fiveItems);
// Remove the key/value pair from the Map
removedData.remove(item.getId());
} else {
// Key/value pair doesn't exist, remove the next 5 items
// from the RecyclerView and add it to the Map
int start = position + 1;
int end = position + 5;
List<Object> fiveItems = data.subList(start, end);
// Add the five items to the Map
removedData.put(item.getId(), fiveItems);
// Remove the items from the RecyclerView
data.subList(start, end).clear();
}
// Notify data set changed
myAdapter.notifyDataSetChanged();
}
}
但是,我在第data.addAll(position, fiveItems)
行上收到了此错误:
06-FATAL EXCEPTION: main
java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.size(ArrayList.java:1028)
at java.util.AbstractCollection.toArray(AbstractCollection.java:136)
at java.util.ArrayList.addAll(ArrayList.java:589)
at com.my.package.activity.MainActivity.onItemClicked(MainActivity.java:238)
at com.my.package.adapter.MyAdapter$ViewHolderItem.onClick(MyAdapter.java:235)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
为什么我收到此错误?我该如何解决?
答案 0 :(得分:1)
在你的data.addAll(position,fiveItems)方法内部使用Object [] a = c.toArray(),它使用Iterator it = iterator();.当你将使用迭代器时同时如果其他一个改变了相同的列表然后modCount将改变导致异常的。所以你需要找出负责它的代码。
toArray()来自java api的源代码
Object[] r = new Object[size()];
Iterator<E> it = iterator();
for (int i = 0; i < r.length; i++) {
if (! it.hasNext()) // fewer elements than expected
return Arrays.copyOf(r, i);
r[i] = it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;