问题描述:
我的项目类似新浪新闻,侧边栏有几个item,每个item对应一个fragment。其中有一个item A对应的JobFragment 中有viewpager,然后viewpager中又有4个fragment。
选中JobFragment时,首先初始化界面,这时候没有数据,然后界面初始化完后,经过访问网络获取数据,然后填充数据到viewpager中的4个fragment中。如图示:
遇到的问题: 第一次选中JobFragment的时候,界面能够正常初始化,而且获取的网络数据也能正常显示到4个fragment中,问题是,如果切换到其他item对应的fragment时候再选中
item A对应的JobFragment,也就是第二次进入JobFragment,界面可以正常显示,但是数据就是不能显示出来,调试的时候发现数据都能正常显示,但是界面就是一片
空白,而且发现第二次进入的时候viewpager中的4个fragment的onCreateView方法都不执行。 将viewpager多滑动几次才会执行onCreateView方法。数据也就能够正常显示。
问题分析: 其实原因就在第二次进入JobFragment时viewpager中的4个fragment的onCreateView没有调用,再向上一层分析,发现onCreateView的调用,是由于被类JobPagerAdapter
中的getItem的调用。其实,为什么会出现第二次进入的时候viewpager中的4个fragment的onCreateView方法都不执行也就是getItem方法没有调用呢?原因就在于FragmentPagerAdapter
的设计原理,关于FragmentStatePagerAdapter和FragmentPagerAdapter的详细区别,请移步 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
问题解决: 问题发现并分析透了就可以对问题进行处理。很简单就 把FragmentPagerAdapter替换成FragmentStatePagerAdapter就可以了。
复制代码
ContentFragment0.java主要代码(viewpager中4个fragment其中的一个)如下:
我的项目类似新浪新闻,侧边栏有几个item,每个item对应一个fragment。其中有一个item A对应的JobFragment 中有viewpager,然后viewpager中又有4个fragment。
选中JobFragment时,首先初始化界面,这时候没有数据,然后界面初始化完后,经过访问网络获取数据,然后填充数据到viewpager中的4个fragment中。如图示:
遇到的问题: 第一次选中JobFragment的时候,界面能够正常初始化,而且获取的网络数据也能正常显示到4个fragment中,问题是,如果切换到其他item对应的fragment时候再选中
item A对应的JobFragment,也就是第二次进入JobFragment,界面可以正常显示,但是数据就是不能显示出来,调试的时候发现数据都能正常显示,但是界面就是一片
空白,而且发现第二次进入的时候viewpager中的4个fragment的onCreateView方法都不执行。 将viewpager多滑动几次才会执行onCreateView方法。数据也就能够正常显示。
问题分析: 其实原因就在第二次进入JobFragment时viewpager中的4个fragment的onCreateView没有调用,再向上一层分析,发现onCreateView的调用,是由于被类JobPagerAdapter
中的getItem的调用。其实,为什么会出现第二次进入的时候viewpager中的4个fragment的onCreateView方法都不执行也就是getItem方法没有调用呢?原因就在于FragmentPagerAdapter
的设计原理,关于FragmentStatePagerAdapter和FragmentPagerAdapter的详细区别,请移步 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
问题解决: 问题发现并分析透了就可以对问题进行处理。很简单就 把FragmentPagerAdapter替换成FragmentStatePagerAdapter就可以了。
JobFragment.java主要代码如下:
- public class JobFragment extends Fragment {
-
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- View view = inflater.inflate(R.layout.job_viewpager_layout, null);
- resources = getResources();
- InitWidth(view);
- InitView(view);
- InitViewPager(view);
-
- loadData(Constant.JOB_BASE_URL, Constant.MSG_LOAD_FRESH);
-
- return view;
- }
-
- private void InitWidth(View view) {
-
- }
-
- private void InitView(View view) {
- TextView topTitle = (TextView) view.findViewById(R.id.AppTopTitle);
- topTitle.setText(R.string.job);
-
- ImageButton top_menu_btn = (ImageButton) view
- .findViewById(R.id.top_menu_btn);
-
-
- mFragment0 = new ContentFragment0();
- mFragment1 = new ContentFragment1();
- mFragment2 = new ContentFragment2();
- mFragment3 = new ContentFragment3();
-
- topProgressBar = (ProgressBar) view.findViewById(R.id.top_progressBar);
- top_refresh_btn = (ImageButton) view.findViewById(R.id.top_refresh_btn);
- loadinglayout = (LinearLayout) view.findViewById(R.id.loading_layout);
- loadinglayout.setVisibility(View.VISIBLE);
-
- tvCompus = (TextView) view.findViewById(R.id.tv_tab_activity);
- tvNew = (TextView) view.findViewById(R.id.tv_tab_groups);
- tvPrimary = (TextView) view.findViewById(R.id.tv_tab_friends);
- tvInternship = (TextView) view.findViewById(R.id.tv_tab_chat);
-
- tvCompus.setOnClickListener(new MyOnClickListener(0));
- tvNew.setOnClickListener(new MyOnClickListener(1));
- tvPrimary.setOnClickListener(new MyOnClickListener(2));
- tvInternship.setOnClickListener(new MyOnClickListener(3));
- }
-
- @SuppressLint("NewApi")
- private void InitViewPager(View view) {
- vp = (ViewPager) view.findViewById(R.id.vPager);
- fpa = new JobPagerAdapter(getActivity().getSupportFragmentManager());
- vp.setAdapter(fpa);
- vp.setOnPageChangeListener(new MyOnPageChangeListener());
- vp.setCurrentItem(0);
- }
-
- public class MyOnClickListener implements View.OnClickListener {
- private int index = 0;
-
- public MyOnClickListener(int i) {
- index = i;
- }
-
- @Override
- public void onClick(View v) {
- vp.setCurrentItem(index);
- }
- };
- //*****************************************************************************************************
- //在这里,之前一直使用的是FragmentPagerAdapter,后经过调试发现FragmentStatePagerAdapter后,问题迎刃而解
- //*****************************************************************************************************
- public class JobPagerAdapter extends FragmentStatePagerAdapter {
-
- public JobPagerAdapter(FragmentManager fm) {
- super(fm);
- // TODO Auto-generated constructor stub
- }
-
- @Override
- public Fragment getItem(int position) {
- // TODO Auto-generated method stub
- Toast.makeText(getActivity(), "JobPagerAdapter getItem", Toast.LENGTH_SHORT).show();
- switch (position) {
- case TAB_INDEX_ONE:
- return mFragment0;
- case TAB_INDEX_TWO:
- return mFragment1;
- case TAB_INDEX_THREE:
- return mFragment2;
- case TAB_INDEX_FOUR:
- return mFragment3;
- }
- throw new IllegalStateException("No fragment at position "
- + position);
- }
-
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return TAB_INDEX_COUNT;
- }
- }
-
- public class MyOnPageChangeListener implements OnPageChangeListener {
-
- @Override
- public void onPageSelected(int arg0) {
- Animation animation = null;
- switch (arg0) {
- case 0:
-
- break;
- case 1:
-
- break;
- case 2:
-
- break;
- case 3:
-
- break;
- }
- currIndex = arg0;
- animation.setFillAfter(true);
- animation.setDuration(300);
- ivBottomLine.startAnimation(animation);
- }
-
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
-
- @Override
- public void onPageScrollStateChanged(int arg0) {
- }
- }
-
- public void loadData(String urlStr, int loadType) {
- setListData(urlStr, loadType);
- }
-
- public void setListData(final String url, final int loadType) {
- Util.refreshBarVisible(topProgressBar, top_refresh_btn);
- new Thread(new Runnable() {
-
- @Override
- public void run() {
- Document d = Util.GetHttp(url, "utf-8");
-
- if (d != null) {
- mHandler.obtainMessage(Constant.MSG_SUCCESS, d)
- .sendToTarget();
- } else {
- mHandler.obtainMessage(Constant.MSG_FAILURE, null)
- .sendToTarget();
- }
- }
- }).start();
- }
-
- @SuppressLint("HandlerLeak")
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- Util.stopLoad(topProgressBar, top_refresh_btn, loadinglayout);
- switch (msg.what) {
- case Constant.MSG_SUCCESS:
- if (msg.obj != null) {
- getJobData((Document) msg.obj);
- } else {
- Util.errView(getActivity(), R.string.yz_err);
- }
- break;
- case Constant.MSG_FAILURE:
- Util.errView(getActivity(), R.string.yz_err);
- break;
- }
- }
- };
-
- public void getJobData(Document doc) {
- List<Map<String, String>> tmp = new ArrayList<Map<String, String>>();
-
- tmp = listData(doc, 1);
- mFragment0.setList(tmp);
-
- tmp = listData(doc, 2);
- mFragment1.setList(tmp);
-
- tmp = listData(doc, 3);
- mFragment2.setList(tmp);
-
- tmp = listData(doc, 4);
- mFragment3.setList(tmp);
- }
-
- public List<Map<String, String>> listData(Document doc, int k) {
- if (doc != null) {
- List<Map<String, String>> tmpList = new ArrayList<Map<String, String>>();
- Map<String, String> map = null;
- int jobItemSize = JobItem(doc, k);
- JobTimePlace(doc, k);
-
- for (int i = 0; i < jobItemSize; i++) {
- map = new HashMap<String, String>();
- map.put("title", JobItemTitle[i]);
- map.put("time", timePlace[i]);
- map.put("joblink", JobItemHref[i]);
- tmpList.add(map);
- }
- return tmpList;
- } else {
- return null;
- }
- }
-
- public void JobTimePlace(Document doc, int i) {
-
- }
-
- public int JobItem(Document doc, int i) {
-
- }
-
- }
- public class ContentFragment0 extends Fragment {
-
- private List<Map<String, String>> list;
- private ListView mListView;
- private JobListViewAdapter adapter;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Constant.view = inflater.inflate(R.layout.job_fragment_layout, null);
- mListView = (ListView) Constant.view.findViewById(R.id.list);
- Constant.mFragmentActivity = getActivity();
-
- mListView.setOnItemClickListener(new OnItemClickListener() {
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- // TODO Auto-generated method stub
-
- }
- });
-
- if (getList()!=null) {
- adapter = new JobListViewAdapter(getActivity(), getList());
- mListView.setAdapter(adapter);
- } else {
- System.out.println("contentfragment0***getList() is null");
- }
-
- return Constant.view;
- }
-
- }