英文:
GridLayoutManager changes to LinearLayoutManager after calling onSaveInstanceState
问题
以下是您提供的内容的翻译部分:
在我的应用程序中,我正在使用带有GridLayout的RecyclerView。我试图保存当前项目索引,以便在旋转设备后正确恢复。似乎不起作用的第一件事是将LayoutManager对象保存为Parcelable:
@Override
protected void onPause() {
super.onPause();
Log.i("From onPause1", (mMoviesRecyclerView.getLayoutManager())+"");
mLayoutManagerState = mMoviesRecyclerView.getLayoutManager().onSaveInstanceState();
Log.i("From onPause2", (mLayoutManagerState)+"");
}
I/From onPause1: androidx.recyclerview.widget.GridLayoutManager@fdb47c1
I/From onPause2: androidx.recyclerview.widget.LinearLayoutManager$SavedState@53fe516
有人知道为什么第二个日志中会得到LinearLayoutManager$SavedState吗?提前感谢。
@Edit1
这些是我正在使用的方法:
@Override
protected void onPause() {
super.onPause();
Log.i("From onPause1", (mMoviesRecyclerView.getLayoutManager())+"");
mLayoutManagerState = (mMoviesRecyclerView.getLayoutManager()).onSaveInstanceState();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(LAYOUT_MANAGER_STATE, mLayoutManagerState);
Log.i("From onSaveINstance", (mLayoutManagerState)+"");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
if (savedInstanceState instanceof Bundle) {
Log.i("From onRestoreInceState", (savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE)+""));
layoutManager = (GridLayoutManager) savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE);
}
super.onRestoreInstanceState(savedInstanceState);
}
在旋转后我得到一个错误:
java.lang.ClassCastException:
androidx.recyclerview.widget.LinearLayoutManager$SavedState无法转换为androidx.recyclerview.widget.GridLayoutManager
英文:
In my app I am using a RecyclerView with GridLayout. I am trying to save the current item index so that it's restored correctly after rotating a device. The first thing that seems not to be working is saving the LayoutManager object as Parcelable:
@Override
protected void onPause() {
super.onPause();
Log.i("From onPause1", (mMoviesRecyclerView.getLayoutManager())+"");
mLayoutManagerState = mMoviesRecyclerView.getLayoutManager().onSaveInstanceState();
Log.i("From onPause2", (mLayoutManagerState)+"");
}
> I/From onPause1: androidx.recyclerview.widget.GridLayoutManager@fdb47c1
> I/From onPause2: androidx.recyclerview.widget.LinearLayoutManager$SavedState@53fe516
Does anyone have an idea why I get LinearLayoutManager$SavedState in the second logging?
Thanks in advance.
@Edit1
Those are the methods I'm using:
@Override
protected void onPause() {
super.onPause();
Log.i("From onPause1", (mMoviesRecyclerView.getLayoutManager())+"");
mLayoutManagerState = (mMoviesRecyclerView.getLayoutManager()).onSaveInstanceState();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(LAYOUT_MANAGER_STATE, mLayoutManagerState);
Log.i("From onSaveINstance", (mLayoutManagerState)+"");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
if (savedInstanceState instanceof Bundle) {
Log.i("From onRestoreInceState", (savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE)+""));
layoutManager = (GridLayoutManager) savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE);
}
super.onRestoreInstanceState(savedInstanceState);
}
I get an error after rotation:
> java.lang.ClassCastException:
> androidx.recyclerview.widget.LinearLayoutManager$SavedState cannot be
> cast to androidx.recyclerview.widget.GridLayoutManager
答案1
得分: 0
如GridLayoutManager
扩展了LinearLayoutManager
:
public class GridLayoutManager extends LinearLayoutManager {
...
}
由此可见,GridLayoutManager
的实例也是LinearLayoutManager
的一个实例。
由于onSaveInstanceState()
在LinearLayoutManager
中实现,因此SavedState
返回的值的类型是LinearLayoutManager.SavedState
。
private GridLayoutManager layoutManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
layoutManager = new GridLayoutManager(this, X);
recyclerView.setLayoutManager(layoutManager);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(LAYOUT_MANAGER_STATE, layoutManager.onSaveInstanceState());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState instanceof Bundle) {
layoutManager.onRestoreInstanceState(savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE));
}
super.onRestoreInstanceState(savedInstanceState);
}
英文:
As GridLayoutManager
extends LinearLayoutManager
:
public class GridLayoutManager extends LinearLayoutManager {
...
}
it's a trivial result that an instance of GridLayoutManager
is a LinearLayoutManager
too.
Since onSaveInstanceState()
is implemented in LinearLayoutManager
so the SavedState
returned value is from type of LinearLayoutManager.SavedState
.
private GridLayoutManager layoutManager;
@Override
public void onCreate(savedInstanceState outState) {
super.onCreate(savedInstanceState);
...
layoutManager = new GridLayoutManager(this, X);
recyclerView.setLayoutManager(layoutManager);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(LAYOUT_MANAGER_STATE, layoutManager.onSaveInstanceState());
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
if (savedInstanceState instanceof Bundle) {
layoutManager.onRestoreInstanceState(savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE));
}
super.onRestoreInstanceState(savedInstanceState);
}
专注分享java语言的经验与见解,让所有开发者获益!
评论