[英]How to avoid recreate Fragment into ViewPager?
I am using a ViewPager with a FragmentStatePagerAdapter that contains 5 pages. 我正在使用一个包含5页的FragmentStatePagerAdapter的ViewPager 。
In the first page I have a ListView with items. 在第一页中,我有一个带有项目的ListView。 When I change at the last page of the ViewPager, and I come back to first page, my ListView is empty because the Adapter has been recreated. 当我在ViewPager的最后一页更改,然后我回到第一页时,我的ListView为空,因为已重新创建了适配器。
Android always calls to the next methods: onAttach(), onCreate(), onCreateView(), onViewCreated(), onActivityCreated(), onStart() and onResume(). Android总是调用下一个方法:onAttach(),onCreate(),onCreateView(),onViewCreated(),onActivityCreated(),onStart()和onResume()。
I would like don't use ViewPager.setOffscreenPageLimit() methods to avoid that my pages can be destroyed. 我想不要使用ViewPager.setOffscreenPageLimit()方法来避免我的页面被销毁。 There are any alternative solution? 还有其他解决方案吗?
The behavior I want is the same that makes Facebook. 我想要的行为与Facebook相同。
What I doing wrong? 我做错了什么? How I can keep the data in my ListView? 如何将数据保存在ListView中?
Code of my FragmentStatePageAdapter: 我的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();
}
}
Code of the first page of my ViewPager: 我的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();
}
}
您可以将此行用于X片段的计数
mViewPager.setOffscreenPageLimit(X);
I have fixed it as follow: 我修好了如下:
In the method onViewCreated() of my Fragment, I avoid recreate the Adapter, checking if is null. 在我的Fragment的onViewCreated()方法中,我避免重新创建Adapter,检查是否为null。
@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);
}
...
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.