0

因此,我有一个 EditText,我在其上设置了 onEditorActionListener,即在用户输入文本并按下回车/搜索后,它将获取详细信息并相应地填充回收站视图。

现在为了保存配置更改的状态,我编写了以下代码 -

Parcelable stateList;

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Saving instance of the state in Parcelable stateList
    stateList = recyclerView.getLayoutManager().onSaveInstanceState();
    outState.putParcelable(RETAIN_STATE, stateList);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if(savedInstanceState!=null) {
        stateList = savedInstanceState.getParcelable(RETAIN_STATE);
        recyclerView.getLayoutManager().onRestoreInstanceState(stateList);
    }
}

但是当我运行它并旋转屏幕时,回收器视图不会从 stateList parcelable 恢复状态。

我正在使用 MVP,所以我在演示者的回调中设置了适配器。

当我们在屏幕旋转后单击键盘上的输入/搜索时,我能够保留状态,所以我在 onRestoreInstanceState() 中尝试了这个 hack,但我认为应该有更好的方法来解决这个问题。

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if(savedInstanceState!=null) {
        //The hack!
        et_search.onEditorAction(EditorInfo.IME_ACTION_SEARCH);
        stateList = savedInstanceState.getParcelable(RETAIN_STATE);
        recyclerView.getLayoutManager().onRestoreInstanceState(stateList);
    }
}

让我知道是否需要更多信息。提前致谢。

4

2 回答 2

0

如果不想通过覆盖配置更改来处理任何自定义内容,您可以让 android 为您处理方向更改。例如隐藏某些视图等

<activity android:name=".mainpage.view.MainActivity" android:configChanges="orientation|screenSize|screenLayout" >

将此包含在该活动的清单中进一步为了在循环器视图中保存滚动位置,您可以使用以下要点来避免重复代码,因为您可以在需要相同功能的项目中使用此自定义循环器视图

import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;

/**
 * Class {@link StatefulRecyclerView} extends {@link RecyclerView} and adds position management on configuration changes.
 *
 * @author FrantisekGazo
 * @version 2016-03-15
 */
public final class StatefulRecyclerView
        extends RecyclerView {

    private static final String SAVED_SUPER_STATE = "super-state";
    private static final String SAVED_LAYOUT_MANAGER = "layout-manager-state";

    private Parcelable mLayoutManagerSavedState;

    public StatefulRecyclerView(Context context) {
        super(context);
    }

    public StatefulRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public StatefulRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        Bundle bundle = new Bundle();
        bundle.putParcelable(SAVED_SUPER_STATE, super.onSaveInstanceState());
        bundle.putParcelable(SAVED_LAYOUT_MANAGER, this.getLayoutManager().onSaveInstanceState());
        return bundle;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        if (state instanceof Bundle) {
            Bundle bundle = (Bundle) state;
            mLayoutManagerSavedState = bundle.getParcelable(SAVED_LAYOUT_MANAGER);
            state = bundle.getParcelable(SAVED_SUPER_STATE);
        }
        super.onRestoreInstanceState(state);
    }

    /**
     * Restores scroll position after configuration change.
     * <p>
     * <b>NOTE:</b> Must be called after adapter has been set.
     */
    private void restorePosition() {
        if (mLayoutManagerSavedState != null) {
            this.getLayoutManager().onRestoreInstanceState(mLayoutManagerSavedState);
            mLayoutManagerSavedState = null;
        }
    }

    @Override
    public void setAdapter(Adapter adapter) {
        super.setAdapter(adapter);
        restorePosition();
    }
}

链接到要点

于 2017-07-31T09:53:51.233 回答
0

您实际上不需要调用onRestoreInstanceStateLayoutManager 中的配置更改,因为它会被自动调用(所有视图都有onSaveInstanceState,并且onRestoreInstanceState是从生命周期所有者传递的)。即使你想 - 你将实现的只是恢复视图的滚动位置。

您实际需要做的是保存数据集/在RecyclerView适配器中使用并在屏幕旋转时将其设置回来。然后再次调用搜索(或过滤器,无论如何)。

于 2017-07-31T09:01:47.783 回答