仅做个人总结和学习记录,观者莫喷,谢谢。
问题一、Recyclerview刷新过快,导致项目崩溃,问题复现如下
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{17acc01 position=14 id=-1, oldPos=14, pLpos:-1 scrap [attachedScrap] tmpDetached no parent}
at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5046)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5177)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5158)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2061)
at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:562)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:555)
at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3330)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3186)
at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1584)
at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:323)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
at android.view.Choreographer.doCallbacks(Choreographer.java:672)
at android.view.Choreographer.doFrame(Choreographer.java:605)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
为了解决这个问题,也是查了好久,网友都是说是谷歌这个控件的自身问题,现在还没有得到优化,解决办法如下:
public class FullyGridLayoutManager extends GridLayoutManager { private boolean isScrollEnabled = true; public FullyGridLayoutManager(Context context, int spanCount) { super(context, spanCount); } public FullyGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { super(context, spanCount, orientation, reverseLayout); }
//重写这个方法,蒋错误返回给控件本身 @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { try { super.onLayoutChildren(recycler, state); } catch (IndexOutOfBoundsException e) { Log.e("problem", "meet a IOOBE in RecyclerView"); } } } 这样之后,没有出现奔溃现象,解决。
问题二、Recyclerview列表实时滑动卡顿的问题
解决办法(亲测,完美):
scroll_list_head.setHasFixedSize(true); scroll_list_head.setNestedScrollingEnabled(false);
问题三、自动滑到到指定的位置,这个问题有多种的解决办法,分部如下:
解决办法1(感觉效果不是很明显,但是还是有效果的,或许是我这个项目要求不一样,这个方法不是很适合):
/** * RecyclerView 移动到当前位置, * * @param manager 设置RecyclerView对应的manager * @param mRecyclerView 当前的RecyclerView * @param n 要跳转的位置 */ public static void MoveToPosition_head(LinearLayoutManager manager, RecyclerView mRecyclerView, int n) { // 第一个可见位置 int firstItem = manager.findFirstVisibleItemPosition(); // 最后一个可见位置 int lastItem = manager.findLastVisibleItemPosition(); if (n <= firstItem) { mRecyclerView.smoothScrollToPosition(n); } else if (n <= lastItem) { int top = mRecyclerView.getChildAt(n - firstItem).getTop(); mRecyclerView.scrollBy(0, top); } else { mRecyclerView.smoothScrollToPosition(n); } }
解决办法二、(这个办法很不错,很好的解决我所需求的问题)
//用于让列表显示到最后一个item ((GridLayoutManager) scroll_list_left.getLayoutManager()).scrollToPositionWithOffset(int position, int offset);
这个文章会持续更新的,记录所遇到的问题