CymChad / BaseRecyclerViewAdapterHelper

BRVAH:Powerful and flexible RecyclerAdapter
http://www.recyclerview.org/
MIT License
24.22k stars 5.14k forks source link

滑动删除崩溃,我是滑动删除到只剩下最后一个就蹦了 #2358

Closed anson39f closed 5 years ago

anson39f commented 6 years ago

随带问下怎么录制gif

07-19 16:19:05.745 29810-29810/com.im.heyuchat E/AndroidRuntime: FATAL EXCEPTION: main Process: com.im.heyuchat, PID: 29810 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{aa35ae9 position=0 id=-1, oldPos=1, pLpos:1 scrap [attachedScrap] tmpDetached no parent} android.support.v7.widget.RecyclerView{f94b488 VFED..... .F....I. 0,0-1080,1692 #7f09018b app:id/recyclerview}, adapter:com.im.heyuchat.messages.ui.adapter.RecentMessagesListAdapter@a827e21, layout:android.support.v7.widget.LinearLayoutManager@a83f246, context:com.im.heyuchat.ui.activity.MainActivity@aa7c3a3 at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5610) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5792) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614) at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3763) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3527) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:606) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1769) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at com.android.internal.policy.DecorView.onLayout(DecorView.java:727) at android.view.View.layout(View.java:17548) at android.view.ViewGroup.layout(ViewGroup.java:5614) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2383) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2110) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1287) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6363) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:873) at android.view.Choreographer.doCallbacks(Choreographer.java:685) at android.view.Choreographer.doFrame(Choreographer.java:621) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:859) at android.os.Handler.handleCallback(Handler.java:754) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:163) at android.app.ActivityThread.main(ActivityThread.java:6337) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770) qq 20180719162830

anson39f commented 6 years ago

private void initRecyclerView() { RecyclerViewHelper.initRecyclerViewV(getContext(), recyclerview, adapter); ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(adapter); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback); itemTouchHelper.attachToRecyclerView(recyclerview); // 开启滑动删除 adapter.enableSwipeItem(); adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() { @Override public void onLoadMoreRequested() { mPresenter.getMessagesMoreFlowLists(); } }); } @Override public void initAction() { adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { mMessagesFlow = (MessagesFlow) adapter.getData().get(position); mMessagesFlow.statusNum = "0"; adapter.notifyItemChanged(position); mPresenter.clearstatus(mMessagesFlow); if (mMessagesFlow.toInfo != null) { MessageListActivity.launch(getContext() , mMessagesFlow.toId, mMessagesFlow.toInfo.url , BlankUtil.isBlank(mMessagesFlow.toInfo.nickname) ? mMessagesFlow.toInfo.account : mMessagesFlow.toInfo.nickname , mMessagesFlow.typechat ); } } }); adapter.setOnItemSwipeListener(new OnItemSwipeListener() { @Override public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder, int pos) { Logger.d("删除onItemSwipeStart"); mSwipePos = pos; } @Override public void clearView(RecyclerView.ViewHolder viewHolder, int pos) { Logger.d("删除clearView" + pos); if (pos == -1) { mPresenter.delete(MessagesFragment.this.mDatas.get(mSwipePos).id); MessagesFragment.this.mDatas.remove(mSwipePos); showToast("删除 " + mSwipePos); } } @Override public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) { Logger.d("删除onItemSwiped"); } @Override public void onItemSwipeMoving(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) { Logger.d("删除onItemSwipeMoving"); } });} @Override public void onResume() { super.onResume(); isHidden = false; mMessagesFlow = null; } @Override public void onPause() { super.onPause(); isHidden = true; } @Override protected void updateViews(boolean isRefresh) { adapter.getData().clear(); mPresenter.getMessagesFlowLists(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search: showToast("search"); return true; case R.id.clock_in: showToast("clock_in"); return true; } return super.onOptionsItemSelected(item); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { ((AppCompatActivity) getActivity()).getMenuInflater().inflate(R.menu.message_menu, menu); super.onCreateOptionsMenu(menu, inflater); } /* 修改同时显示图标和文字 @param menu */ @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); if (menu != null) { if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) { try { Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); method.setAccessible(true); method.invoke(menu, true); } catch (Exception e) { e.printStackTrace(); } } } } @Override public void loadData(List data) { adapter.setNewData(data); if (mDatas == null) { mDatas = new ArrayList<>(); } mDatas.clear(); mDatas.addAll(data); } @Override public void loadMoreData(List data) { adapter.addData(data); adapter.loadMoreComplete(); mDatas.addAll(data); } @Override public void loadNoData() { } @Override public void loadErrorData() { adapter.loadMoreFail(); } @Override public void loadMoreEnd() { adapter.loadMoreEnd(); }

anson39f commented 6 years ago

我用这方法可以解决问题了,但是不知道出问题在哪里; 方法一 自己写一个继承LinearLayoutManager的包装类,在onLayoutChildren()方法里try-catch捕获该异常。

@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { try { super.onLayoutChildren(recycler, state); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } }

作者:sugaryaruan 链接:https://www.jianshu.com/p/2eca433869e9

shiguiyou commented 5 years ago

我也是只有一个的话,adapter.notifyItemRemoved(pos);会闪退报错