2016-09-20 2 views
2

내 응용 프로그램 목록에서 페이지 매김을 사용하려면 사용자 지정 RecyclerView을 만들었습니다. 나는 상태를 복원하는 데 충돌이있다. 어쩌면이 충돌은 지원 라이브러리의 알려진 버그와 관련되어 있지만, 지원되는 라이브러리 버전 24.0.0 : https://code.google.com/p/android/issues/detail?id=196430에서 해결되었지만 여전히 충돌하고 있습니다.상태 사용자 지정 RecyclerView 저장

어쩌면 내가 뭔가 잘못하고있는 것일까 요? BadParcelableException ClassNotFoundException when unmarshalling: android.support.v7.widget.RecyclerView$SavedStateHere이 SavedState를 다시 만들려고합니다. 내가 저장하고 컨트롤러의 상태를 복원하고있어 어디

다음
public static class SavedState extends RecyclerView.BaseSavedState { 

    public boolean isLastPage; 
    public boolean isLoading; 
    public int maxPages; 
    public int pageSize; 
    public int currentPage; 
    public int firstVisibleItem; 
    public Parcelable layoutManagerState; 

    public SavedState(Parcelable superState) { 
     super(superState); 
    } 

    public SavedState(Parcel source) { 
     super(source); 
     this.isLastPage = source.readByte() == 1; 
     this.isLoading = source.readByte() == 1; 
     this.maxPages = source.readInt(); 
     this.pageSize = source.readInt(); 
     this.currentPage = source.readInt(); 
     this.firstVisibleItem = source.readInt(); 
     this.layoutManagerState = source.readParcelable(LinearLayoutManager.SavedState.class.getClassLoader()); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
     dest.writeByte((byte) (isLastPage ? 1 : 0)); 
     dest.writeByte((byte) (isLoading ? 1 : 0)); 
     dest.writeInt(maxPages); 
     dest.writeInt(pageSize); 
     dest.writeInt(currentPage); 
     dest.writeInt(firstVisibleItem); 
     dest.writeParcelable(layoutManagerState, flags); 
    } 

    public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { 
     @Override 
     public SavedState createFromParcel(Parcel source) { 
      return new SavedState(source); 
     } 

     @Override 
     public SavedState[] newArray(int size) { 
      return new SavedState[size]; 
     } 
    }; 
} 

은 다음과 같습니다 : 여기

CustomRecyclerView 컨트롤러 안에 내 SavedState 클래스입니다

public Parcelable saveState(Parcelable superState) { 
    SavedState savedState  = new SavedState(superState); 
    savedState.isLastPage  = this.isLastPage; 
    savedState.isLoading  = this.isLoading; 
    savedState.maxPages   = this.maxPages; 
    savedState.pageSize   = this.pageSize; 
    savedState.currentPage  = this.currentPage; 
    savedState.firstVisibleItem = this.firstVisibleItemPosition; 

    if (layoutManager != null) { 
     savedState.layoutManagerState = layoutManager.onSaveInstanceState(); 
    } 

    return savedState; 
} 

public Parcelable restoreState(SavedState savedState) { 

    this.isLastPage     = savedState.isLastPage; 
    this.isLoading     = savedState.isLoading; 
    this.maxPages     = savedState.maxPages; 
    this.pageSize     = savedState.pageSize; 
    this.currentPage    = savedState.currentPage; 
    this.firstVisibleItemPosition = savedState.firstVisibleItem; 

    return savedState.layoutManagerState; 
} 

을 그리고 여기에 onSaveInstanceStateonRestoreInstanceState입니다 사용자 지정 RecyclerView의 구현 :

@Override 
    protected Parcelable onSaveInstanceState() { 

     return controller.saveState(super.onSaveInstanceState()); 
    } 

    @Override 
    protected void onRestoreInstanceState(Parcelable state) { 

     if (state instanceof EndlessRecyclerViewController.SavedState) { 

      EndlessRecyclerViewController.SavedState savedState = (EndlessRecyclerViewController.SavedState) state; 

      Parcelable layoutManagerState = controller.restoreState(savedState); 

      getLayoutManager().onRestoreInstanceState(layoutManagerState); 
      super.onRestoreInstanceState(savedState.getSuperState()); 
     } 
     else 
      super.onRestoreInstanceState(state); 
    } 

도 지원 AbsSavedState에서 SavedState을 확장하려고 시도했지만 여전히 충돌합니다. 전화해야 할 지 모르겠다. LinearLayoutManager ...

고마워!

+0

대신 BaseSaveState, recyclerview 간단한 재정의 onsaveInstanceState 및 확장을 번들에 필요한 값을 저장하고 onrestoreinstancestate 무시하고 그 값을 복원 –

+0

하지만 CustomViews에서 onSaveInstanceState에 번들을받지 못하면 데이터로 사용자 정의 상태 클래스를 만들고이를 onSaveInstanceState에서 Parcelable로 반환해야합니다. 맞습니까? – antonicg

답변

0

마지막으로 지원 라이브러리 버전 24.2.1에서 AbsSavedState (즉, SavedState 클래스를 확장)을 사용하여 해결했습니다. 그리고에서 Parcel 객체를받는 constructor 변경 :

public SavedState(Parcel source) { 
    super(source); 
    //... 
} 

에 :

public SavedState(Parcel source) { 
    super(source, LinearLayoutManager.class.getClassLoader()); 
    //... 
} 
관련 문제