Tại sao ngoại lệ thực hiện khi tôi xóa một số mục trong RecyclerView
bằng cách sử dụng vòng lặp? Tôi đã sử dụng Collentions.synchronizedMap
trong bộ điều hợp và 'phương pháp deleteItem' sử dụng đồng bộ hóa quá (phương pháp trong phân đoạn).RecyclerView IndexOutOfBoundsException
public void elementController(JsonObject jsonObject , String type) {
if (jsonObject == null || type == null) {
return;
}
int position =0 , resultPosition =0;
if (type.equals("update") || type.equals("delete")) {
String id = jsonObject.get(ELEMENT_ID).getAsString();
Map<String , Element> map = gridFragment.getMap();
synchronized (map) {
for (String s : map.keySet()) {
if (s.equals(id)) {
resultPosition = position;
} else {
position++;
}
}
}
}
if(position-1 > gridFragment.getmAdapter().getData().size() || position <0) {
return;
}
switch (type) {
case "add":
if (gridFragment.addElement(MyJsonParser.ElementParse(jsonObject),0)){
LogUtils.logDebug(TAG,"add end");
}
break;
case "update":
if(gridFragment.updateElement(updateParser(jsonObject),resultPosition)){
LogUtils.logDebug(TAG,"update end");
}
break;
case "delete":
if(gridFragment.deleteElement(jsonObject.get(ELEMENT_ID).getAsString(),resultPosition)){
LogUtils.logDebug(TAG,"delete end");
}
break;
}
}
public boolean deleteElement(final String id , final int position){
new Thread(new Runnable() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable(){
@Override
public void run() {
synchronized (map) {
map.remove(id);
mAdapter.setData(map);
mAdapter.notifyItemRemoved(position);
}
}
});
}
}).start();
return true;
}
lỗi My Log:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 0(offset:0).state:4
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3382)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3340)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1810)
at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:356)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1269)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:523)
at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:151)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1942)
at android.support.v7.widget.RecyclerView.resumeRequestLayout(RecyclerView.java:1171)
at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:167)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:543)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:212)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)
at dalvik.system.NativeStart.main(Native Method)
thiết bị không tìm thấy
mã đầu tiên không có ý nghĩa, bạn lặp lại và chỉ nhận được một vị trí từ vòng lặp. không có điều kiện break –
Bạn đang thiết lập dữ liệu mAdapter của bạn sau khi loại bỏ các mục, và sau đó cố gắng để loại bỏ các vị trí được chỉ định, mà trong trường hợp này không tồn tại. –
tất cả mã đầu tiên được gọi bằng dịch vụ (tôi sử dụng mạng ổ cắm với máy chủ). tôi có jsonarray từ máy chủ và gửi jsonobjects đến mã đầu tiên trong jsonarray bởi cho vòng lặp. vì vậy nó là vòng lặp đầu tiên. tôi đoán jsonobject thứ hai đã được sended bởi params để mã đầu tiên trước khi kết thúc mã đầu tiên. –