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

时间:2015-02-23 05:12:50

标签: java android android-fragments

我正在使用SearchActivity的应用程序中工作;搜索活动只是" SearchFragment"的一个容器。和#34; SearchFragment" ActionBar中包含SearchView,其主要布局有RecyclerView以显示搜索结果。假设用户执行搜索,结果显示在RecyclerView内,然后用户旋转屏幕......在这种情况下,我使用setRetainInstance(true)方法。我假设我的自定义ArrayAdapter数据将保存,但事实并非如此。我知道我可以使用Bundle onSaveInstanceState()方法保存ArrayAdapter数据。但我想知道为什么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;
            }

  }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

你不应该把数据保存在视图中,比如活动,片段或适配器,如果你分开视图和模型,那么你不会担心数据丢失,当视图破坏时,你的模型也很好在不同的视图中有多个表示,例如将其显示为列表视图或网格视图。 Model–view–controller