내 응용 프로그램 목록에서 페이지 매김을 사용하려면 사용자 지정 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;
}
을 그리고 여기에 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);
}
도 지원 AbsSavedState
에서 SavedState
을 확장하려고 시도했지만 여전히 충돌합니다. 전화해야 할 지 모르겠다. LinearLayoutManager
...
고마워!
대신 BaseSaveState, recyclerview 간단한 재정의 onsaveInstanceState 및 확장을 번들에 필요한 값을 저장하고 onrestoreinstancestate 무시하고 그 값을 복원 –
하지만 CustomViews에서 onSaveInstanceState에 번들을받지 못하면 데이터로 사용자 정의 상태 클래스를 만들고이를 onSaveInstanceState에서 Parcelable로 반환해야합니다. 맞습니까? – antonicg