Android 에서 Recyclerview 를 사용 하여 발생 한 문제 기록

6493 단어 Recyclerview
개인 총화 와 학습 기록 만 하고 보 는 사람 은 뿌리 지 마 세 요.감사합니다.
문제 1.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");
    }
}
}
    ,        ,  。

질문 2.Recyclerview 목록 이 실시 간 으로 미 끄 러 지 는 문제
해결 방법(친 측,완벽):
scroll_list_head.setHasFixedSize(true);
scroll_list_head.setNestedScrollingEnabled(false);

문제 3.자동 으로 지 정 된 위치 로 미 끄 러 집 니 다.이 문 제 는 여러 가지 해결 방법 이 있 습 니 다.분 부 는 다음 과 같 습 니 다.
해결 방법 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);
    }
}

해결 방법 2.(이 방법 은 아주 좋 습 니 다.제 가 필요 로 하 는 문 제 를 잘 해결 합 니 다)
//            item
((GridLayoutManager) scroll_list_left.getLayoutManager()).scrollToPositionWithOffset(int position, int offset);

이 글 은 지속 적 으로 업데이트 되 어 발생 한 문 제 를 기록 할 것 이다.

좋은 웹페이지 즐겨찾기