java - setRetainInstance() 方法是否保留 ArrayAdapter 数据?

标签 java android android-fragments

我正在使用一个具有 SearchActivity 的应用程序;搜索 Activity 只是“SearchFragment”的容器,“SearchFragment”在ActionBar中包含一个SearchView,其主要布局有一个RecyclerView来显示搜索结果。假设用户执行搜索,结果显示在 RecyclerView 中,然后用户旋转屏幕...在这种情况下,我使用 setRetainInstance(true) 方法。我假设我的自定义 ArrayAdapter 数据将被保存,但事实并非如此。我知道我可以将 ArrayAdapter 数据保存在 Bundle 中用于 onSaveInstanceState() 方法。但我想知道为什么 setRetainInstance() 方法不起作用。

public class SearchFragment extends Fragment
                implements SearchView.OnQueryTextListener,
                ResultsListAdapter.ItemClickListener {

            private ResultsListAdapter mListAdapter;
            private CustomRecyclerView resultsList;

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

            @Override
            public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

                View rootView = inflater.inflate(R.layout.fragment_search, container, false);

                RecyclerView.LayoutManager linearManager = new LinearLayoutManager(getActivity());
                mListAdapter = new ResultsListAdapter(new ArrayList<Kiosk>(), this);

                resultsList.setAdapter(mListAdapter);
                resultsList.setLayoutManager(linearManager);
                resultsList.setSetEmptyView(rootView.findViewById(R.id.empty_view));

                if (savedInstanceState == null){
                    setRetainInstance(true);
                }

                return rootView;
            }
         @Override
            public boolean onQueryTextSubmit(String s) {
                if(s.isEmpty()) {
                    //Set an empty array, to set an empty view
                    mListAdapter.changeData(new ArrayList<Kiosk>());
                    mListAdapter.notifyDataSetChanged();
                }

                ArrayList<Kiosk> kiosksFound = performSearch(s);

                mListAdapter.changeData(kiosksFound);
                mListAdapter.notifyDataSetChanged();

                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                if(s.isEmpty()) {
                    //Set an empty array, to set an empty view
                    mListAdapter.changeData(new ArrayList<Kiosk>());
                    mListAdapter.notifyDataSetChanged();
                    return false;
                }

                ArrayList<Kiosk> kiosksFound = performSearch(s);

                mListAdapter.changeData(kiosksFound);
                mListAdapter.notifyDataSetChanged();

                return false;
            }

  }

最佳答案

即使保留状态,onCreateView 仍会被调用。由于您在那里重新创建 ListView ,因此数据被清除。

关于java - setRetainInstance() 方法是否保留 ArrayAdapter 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28667274/

相关文章:

java - 无法从数组中随机搜索项目

java - 如何传递或分配在 runOnUiThread 中获得的值

android - 从 youtube 返回到我的 android 应用程序

android - 无法使用 rild-debug 拨号?

android - 我如何在 DatePicker 上获取当天的字符串名称

java - 按下按键和播放器动画发生之间的延迟(KeyListener,Java)

java - 使用确定的比较器呈指数增加的循环的运行时间是多少?

java - 显示或隐藏 fragment 菜单

android - 如何在运行时使用动态 ID 添加 android View

java - android:如何从扩展 RecyclerView 的类更新徽章 TextView