GridLayoutManager在调用onSaveInstanceState后更改为LinearLayoutManager。

huangapple 未分类评论47阅读模式
英文:

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

huangapple
  • 本文由 发表于 2020年7月26日 16:26:12
  • 转载请务必保留本文链接:https://java.coder-hub.com/63097821.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定