2016-09-20 11 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.

Вот мой SavedState класс внутри CustomRecyclerView контроллера:

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]; 
     } 
    }; 
} 

Вот где я сохранение и восстановление состояния в контроллере:

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; 
} 

А вот onSaveInstanceState и onRestoreInstanceState реализации в пользовательском 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); 
    } 

Я также пытался расширить SavedState от поддержки AbsSavedState и все еще сбой. И я не уверен, что мне нужно позвонить в onSaveInstanceState из LinearLayoutManager ...

Спасибо!

+0

вместо расширения BaseSaveState, просто переопределить onsaveInstanceState в recyclerview и сохранить требуемые значения в корешке и переопределить onrestoreinstancestate и восстановить эти значения –

+0

Но в CustomViews вы не получаете Bundle в onSaveInstanceState, вам нужно создать пользовательский класс состояний с вашими данными и вернуть его в onSaveInstanceState как Parcelable, правильно? – antonicg

ответ

0

Наконец-то я решил использовать AbsSavedState (так что я расширяю класс SavedState) из библиотеки поддержки 24.2.1. И изменения constructor, который принимает Parcel объект от:

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

к:

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