4

我正在使用ViewPagerFragmentStatePagerAdapter包含5页。如何避免重新创建片段到ViewPager中?

在第一页我有一个ListView的项目。当我在ViewPager的最后一页进行更改并返回第一页时,我的ListView是空的,因为适配器已被重新创建。 onAttach(),onCreate(),onCreateView(),onViewCreated(),onActivityCreated(),onStart()和onResume()方法总是调用下一个方法。

我想不要使用ViewPager.setOffscreenPageLimit()避免我的页面被破坏的方法。有其他解决方案吗?

我想要的行为与使Facebook相同。

我做错了什么?我如何将数据保存在我的ListView中?

代码我FragmentStatePageAdapter的:

public class AdapterMain extends FragmentStatePagerAdapter { 
    List<ChicfyFragment> fragments = new ArrayList<ChicfyFragment>(); 

    public AdapterMain(FragmentManager fm) { 
     super(fm); 

     fragments.add(new FragmentShop()); 
     fragments.add(new FragmentSearch()); 
     fragments.add(new FragmentSell()); 
     fragments.add(new FragmentNotification()); 
     fragments.add(new FragmentProfile()); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 
} 

我ViewPager的第一页的代码:

public class FragmentShop extends ChicfyFragment implements SwipeRefreshLayout.OnRefreshListener { 

    ListView mListView; 
    AdapterProductList mAdapter; 
    SwipeRefreshLayout mSwipeRefreshLayout; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_main_shop, container, false); 

     mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh); 
     mListView = (ListView) view.findViewById(R.id.fragment_main_shop_listview); 

     return view; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     // setup adapter 
     mAdapter = new AdapterProductList((FragmentActivity) getActivity(), new ArrayList()); 

     // setup listview 
     mListView.setAdapter(mAdapter); 
     mListView.setDivider(null); 

     // setup swipe 
     mSwipeRefreshLayout.setColorScheme(R.color.red, R.color.white, R.color.blue, R.color.white); 
     mSwipeRefreshLayout.setOnRefreshListener(this); 
    } 

    @Override 
    public void onRefresh() { 
     new AsyncTask<Void, Void, Void>() { 
      List<String> list = new ArrayList<String>(); 

      @Override 
      protected Void doInBackground(Void... voids) { 
       try { 
        Thread.sleep(1000); 
        for(int i=0; i<10; i++) list.add("" + i); 
       } catch (Exception e) {} 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       super.onPostExecute(aVoid); 

       mAdapter.clear(); 
       mAdapter.addAll(list); 
       mAdapter.notifyDataSetChanged(); 

       mSwipeRefreshLayout.setRefreshing(false); 
      } 
     }.execute(); 
    } 
} 

回答

3

我有固定如下:

在onViewCreated()的方法的我的片段,我避免重新创建适配器,检查是否为空。

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // setup adapter 
    if(mAdapter == null) { 
     mAdapter = new AdapterProductList((FragmentActivity) getActivity(), new ArrayList()); 
     mAdapter.setOnLastItemListener(this); 
    } 

    ... 
    ... 

} 
+0

我这样做的X计数。但mAdapter仍然为空。所以它仍然在重新创建... – 2015-03-20 09:47:55

+0

尝试为FragmentShop片段调用setRetainInstance(true)。你可以从它的构造函数中做到这一点。 – Grimmy 2016-06-06 12:21:57

5

像你说的,您可以使用这一行片段

mViewPager.setOffscreenPageLimit(X);

+0

它像一个魅力。谢谢你,朋友 – 2017-06-30 14:23:02

相关问题