要保存嵌套RecyclerView的滚动位置,可以使用以下步骤:
以下是一个示例代码:
public class ParentRecyclerView extends RecyclerView {
private LinearLayoutManager mLayoutManager;
private SparseArray mSavedStateArray = new SparseArray<>();
public ParentRecyclerView(Context context) {
super(context);
init();
}
public ParentRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ParentRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
mLayoutManager = new LinearLayoutManager(getContext());
setLayoutManager(mLayoutManager);
}
@Override
protected Parcelable onSaveInstanceState() {
Bundle state = new Bundle();
state.putParcelable("superState", super.onSaveInstanceState());
// 保存子RecyclerView的滚动位置
for (int i = 0; i < getChildCount(); i++) {
View childView = getChildAt(i);
if (childView instanceof ChildRecyclerView) {
int position = getChildAdapterPosition(childView);
Parcelable savedState = mLayoutManager.onSaveInstanceState();
mSavedStateArray.put(position, savedState);
}
}
state.putSparseParcelableArray("childStates", mSavedStateArray);
return state;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
Bundle savedState = (Bundle) state;
super.onRestoreInstanceState(savedState.getParcelable("superState"));
// 恢复子RecyclerView的滚动位置
mSavedStateArray = savedState.getSparseParcelableArray("childStates");
for (int i = 0; i < mSavedStateArray.size(); i++) {
int position = mSavedStateArray.keyAt(i);
Parcelable childState = mSavedStateArray.get(position);
View childView = mLayoutManager.findViewByPosition(position);
if (childView instanceof ChildRecyclerView) {
((ChildRecyclerView) childView.getLayoutManager()).onRestoreInstanceState(childState);
}
}
} else {
super.onRestoreInstanceState(state);
}
}
}
public class ChildRecyclerView extends RecyclerView {
private LinearLayoutManager mLayoutManager;
public ChildRecyclerView(Context context) {
super(context);
init();
}
public ChildRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ChildRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
mLayoutManager = new LinearLayoutManager(getContext());
setLayoutManager(mLayoutManager);
}
}
在示例中,ParentRecyclerView
是父RecyclerView,ChildRecyclerView
是子RecyclerView。在ParentRecyclerView
的onSaveInstanceState
方法中,保存了子RecyclerView的滚动位置,并在onRestoreInstanceState
方法中恢复了子RecyclerView的滚动位置。