gpt4 book ai didi

android - 保存 RecyclerView 状态的最佳方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:37 24 4
gpt4 key购买 nike

我在主要 Activity 中有包含 recyclerview 的 fragment

fragment .java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.activity_main, container, false);
initInstances(view);
setRetainInstance(true);
return view;
}

private void initInstances(View view) {
mRecyclerView = (RecyclerView) view.findViewById(R.id.dialogList);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
adapter = new MyAdapter(items);
mRecyclerView.setAdapter(mAdapter);
}

主 Activity .java

在onCreate方法中:

myFragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(MyFragment.TAG);
if (MyFragment == null) {
MyFragment = new MyFragment();
getSupportFragmentManager().beginTransaction().add(R.id.content_frame,
myFragment, MyFragment.TAG).commit();
}

但是当方向改变时,我的 RecyclerView 会重新绘制。

我试过通过覆盖 onSaveInstanceStateonRestoreInstanceState 来保存状态,就像这样 How to prevent custom views from losing state across screen orientation changesSaving and restoring view state android , 但对我无济于事

如何在方向改变时正确保存 RecyclerView 和适配器项目的状态?

解决方案:我的 fragment 使用一些方法从 BaseFragment 扩展而来:

public class BaseFragment extends Fragment{
Bundle savedState;

public BaseFragment() {
super();
if (getArguments() == null)
setArguments(new Bundle());
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!restoreStateFromArguments()) {
onFirstTimeLaunched();
}
}

protected void onFirstTimeLaunched() {

}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveStateToArguments();
}



public void saveStateToArguments() {
if (getView() != null)
savedState = saveState();
if (savedState != null) {
Bundle b = getArguments();
b.putBundle("internalSavedViewState8954201239547", savedState);
}
}



private boolean restoreStateFromArguments() {
Bundle b = getArguments();
savedState = b.getBundle("internalSavedViewState8954201239547");
if (savedState != null) {
onRestoreState(savedState);
return true;
}
return false;
}

private Bundle saveState() {
Bundle state = new Bundle();
onSaveState(state);
return state;
}

protected void onRestoreState(Bundle savedInstanceState) {

}

protected void onSaveState(Bundle outState) {

}

@Override
public void onStart() {
super.onStart();
}

@Override
public void onStop() {
super.onStop();
}


@Override
public void onDestroyView() {
super.onDestroyView();
saveStateToArguments();
}

在我的 fragment 中,我覆盖了方法并保存了 mLayoutManager 的状态

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}

@Override
protected void onSaveState(Bundle outState) {
super.onSaveState(outState);
outState.putParcelable("myState", mLayoutManager.onSaveInstanceState());
}

@Override
protected void onRestoreState(Bundle savedInstanceState) {
super.onRestoreState(savedInstanceState);
mLayoutManager.onRestoreInstanceState(savedInstanceState.getParcelable("myState"));
}

最佳答案

我搜索了如何获取 RecyclerView 的滚动位置,但没有看到在哪里可以检索它,所以我认为最好的解决方案是直接在您的 Java 代码中处理旋转更改,并防止您的 Activity 重新启动方向改变。

为了防止在方向改变时重新启动,你可以关注this solution .

在防止您的 Activity 重新启动后,您可以构建 2 个 xml 布局文件,一个用于纵向模式,一个用于横向模式,您在两个 xml 文件中添加一个 FrameLayout,为您的 RecyclerView 保留位置。

当调用 onConfigurationChange(Configuration newConfig) 方法时,您将根据新的方向使用适当的 LayoutFile 调用 setContentView(int layoutFile),并将您持有的 RecyclerView 添加到 FrameLayout 中的类成员中。

关于android - 保存 RecyclerView 状态的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29840064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com