【问题标题】:How to avoid recreate Fragment into ViewPager?如何避免将 Fragment 重新创建到 ViewPager 中?
【发布时间】:2014-10-08 12:01:00
【问题描述】:

我正在使用一个 ViewPager 和一个包含 5 个页面的 FragmentStatePagerAdapter

在第一页中,我有一个包含项目的 ListView。当我在 ViewPager 的最后一页更改并返回第一页时,我的 ListView 为空,因为适配器已重新创建。

Android 总是调用下一个方法: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();
    }
}

【问题讨论】:

    标签: android android-fragments android-listview android-viewpager fragmentstatepageradapter


    【解决方案1】:

    您可以将此行用于 X 片段计数

    mViewPager.setOffscreenPageLimit(X);

    【讨论】:

      【解决方案2】:

      我已将其修复如下:

      在我的 Fragment 的 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);
          }
      
          ...
          ...
      
      }
      

      【讨论】:

      • 我按照你说的做了。但 mAdapter 仍然为空。所以它仍然在重新创建......
      • 尝试为 FragmentShop 片段调用 setRetainInstance(true)。你可以从它的构造函数中做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      相关资源
      最近更新 更多