关闭

解决fragment+viewpager第二次进入的时候没有数据的问题

618人阅读 评论(1) 收藏 举报
分类:
问题描述:
我的项目类似新浪新闻,侧边栏有几个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主要代码如下:

  1. public class JobFragment extends Fragment {

  2.         public View onCreateView(LayoutInflater inflater, ViewGroup container,
  3.                         Bundle savedInstanceState) {

  4.                 View view = inflater.inflate(R.layout.job_viewpager_layout, null);
  5.                 resources = getResources();
  6.                 InitWidth(view);
  7.                 InitView(view);
  8.                 InitViewPager(view);

  9.                 loadData(Constant.JOB_BASE_URL, Constant.MSG_LOAD_FRESH);

  10.                 return view;
  11.         }

  12.         private void InitWidth(View view) {
  13.                 
  14.         }

  15.         private void InitView(View view) {
  16.                 TextView topTitle = (TextView) view.findViewById(R.id.AppTopTitle);
  17.                 topTitle.setText(R.string.job);

  18.                 ImageButton top_menu_btn = (ImageButton) view
  19.                                 .findViewById(R.id.top_menu_btn);
  20.                 
  21.                 
  22.                 mFragment0 = new ContentFragment0();                        
  23.                 mFragment1 = new ContentFragment1();
  24.                 mFragment2 = new ContentFragment2();
  25.                 mFragment3 = new ContentFragment3();

  26.                 topProgressBar = (ProgressBar) view.findViewById(R.id.top_progressBar);
  27.                 top_refresh_btn = (ImageButton) view.findViewById(R.id.top_refresh_btn);
  28.                 loadinglayout = (LinearLayout) view.findViewById(R.id.loading_layout);
  29.                 loadinglayout.setVisibility(View.VISIBLE);

  30.                 tvCompus = (TextView) view.findViewById(R.id.tv_tab_activity);
  31.                 tvNew = (TextView) view.findViewById(R.id.tv_tab_groups);
  32.                 tvPrimary = (TextView) view.findViewById(R.id.tv_tab_friends);
  33.                 tvInternship = (TextView) view.findViewById(R.id.tv_tab_chat);

  34.                 tvCompus.setOnClickListener(new MyOnClickListener(0));
  35.                 tvNew.setOnClickListener(new MyOnClickListener(1));
  36.                 tvPrimary.setOnClickListener(new MyOnClickListener(2));
  37.                 tvInternship.setOnClickListener(new MyOnClickListener(3));
  38.         }

  39.         @SuppressLint("NewApi")
  40.         private void InitViewPager(View view) {
  41.                 vp = (ViewPager) view.findViewById(R.id.vPager);
  42.                 fpa = new JobPagerAdapter(getActivity().getSupportFragmentManager());
  43.                 vp.setAdapter(fpa);
  44.                 vp.setOnPageChangeListener(new MyOnPageChangeListener());
  45.                 vp.setCurrentItem(0);
  46.         }

  47.         public class MyOnClickListener implements View.OnClickListener {
  48.                 private int index = 0;

  49.                 public MyOnClickListener(int i) {
  50.                         index = i;
  51.                 }

  52.                 @Override
  53.                 public void onClick(View v) {
  54.                         vp.setCurrentItem(index);
  55.                 }
  56.         };
  57.         //*****************************************************************************************************
  58.         //在这里,之前一直使用的是FragmentPagerAdapter,后经过调试发现FragmentStatePagerAdapter后,问题迎刃而解
  59.         //*****************************************************************************************************
  60.         public class JobPagerAdapter extends FragmentStatePagerAdapter {

  61.                 public JobPagerAdapter(FragmentManager fm) {
  62.                         super(fm);
  63.                         // TODO Auto-generated constructor stub
  64.                 }

  65.                 @Override
  66.                 public Fragment getItem(int position) {
  67.                         // TODO Auto-generated method stub
  68.                         Toast.makeText(getActivity(), "JobPagerAdapter getItem", Toast.LENGTH_SHORT).show();
  69.                         switch (position) {
  70.                         case TAB_INDEX_ONE:
  71.                                 return mFragment0;
  72.                         case TAB_INDEX_TWO:
  73.                                 return mFragment1;
  74.                         case TAB_INDEX_THREE:
  75.                                 return mFragment2;
  76.                         case TAB_INDEX_FOUR:
  77.                                 return mFragment3;
  78.                         }
  79.                         throw new IllegalStateException("No fragment at position "
  80.                                         + position);
  81.                 }

  82.                 @Override
  83.                 public int getCount() {
  84.                         // TODO Auto-generated method stub
  85.                         return TAB_INDEX_COUNT;
  86.                 }
  87.         }

  88.         public class MyOnPageChangeListener implements OnPageChangeListener {

  89.                 @Override
  90.                 public void onPageSelected(int arg0) {
  91.                         Animation animation = null;
  92.                         switch (arg0) {
  93.                         case 0:
  94.                                 
  95.                                 break;
  96.                         case 1:
  97.                                 
  98.                                 break;
  99.                         case 2:
  100.                                 
  101.                                 break;
  102.                         case 3:
  103.                                 
  104.                                 break;
  105.                         }
  106.                         currIndex = arg0;
  107.                         animation.setFillAfter(true);
  108.                         animation.setDuration(300);
  109.                         ivBottomLine.startAnimation(animation);
  110.                 }

  111.                 @Override
  112.                 public void onPageScrolled(int arg0, float arg1, int arg2) {
  113.                 }

  114.                 @Override
  115.                 public void onPageScrollStateChanged(int arg0) {
  116.                 }
  117.         }

  118.         public void loadData(String urlStr, int loadType) {
  119.                 setListData(urlStr, loadType);
  120.         }

  121.         public void setListData(final String url, final int loadType) {
  122.                 Util.refreshBarVisible(topProgressBar, top_refresh_btn);
  123.                 new Thread(new Runnable() {

  124.                         @Override
  125.                         public void run() {
  126.                                 Document d = Util.GetHttp(url, "utf-8");

  127.                                 if (d != null) {
  128.                                         mHandler.obtainMessage(Constant.MSG_SUCCESS, d)
  129.                                                         .sendToTarget();
  130.                                 } else {
  131.                                         mHandler.obtainMessage(Constant.MSG_FAILURE, null)
  132.                                                         .sendToTarget();
  133.                                 }
  134.                         }
  135.                 }).start();
  136.         }

  137.         @SuppressLint("HandlerLeak")
  138.         private Handler mHandler = new Handler() {
  139.                 public void handleMessage(Message msg) {
  140.                         Util.stopLoad(topProgressBar, top_refresh_btn, loadinglayout);
  141.                         switch (msg.what) {
  142.                         case Constant.MSG_SUCCESS:
  143.                                 if (msg.obj != null) {
  144.                                         getJobData((Document) msg.obj);
  145.                                 } else {
  146.                                         Util.errView(getActivity(), R.string.yz_err);
  147.                                 }
  148.                                 break;
  149.                         case Constant.MSG_FAILURE:
  150.                                 Util.errView(getActivity(), R.string.yz_err);
  151.                                 break;
  152.                         }
  153.                 }
  154.         };

  155.         public void getJobData(Document doc) {
  156.                 List<Map<String, String>> tmp = new ArrayList<Map<String, String>>();
  157.                 
  158.                 tmp = listData(doc, 1);
  159.                 mFragment0.setList(tmp);

  160.                 tmp = listData(doc, 2);
  161.                 mFragment1.setList(tmp);
  162.                 
  163.                 tmp = listData(doc, 3);
  164.                 mFragment2.setList(tmp);
  165.                 
  166.                 tmp = listData(doc, 4);
  167.                 mFragment3.setList(tmp);
  168.         }

  169.         public List<Map<String, String>> listData(Document doc, int k) {
  170.                 if (doc != null) {
  171.                         List<Map<String, String>> tmpList = new ArrayList<Map<String, String>>();
  172.                         Map<String, String> map = null;
  173.                         int jobItemSize = JobItem(doc, k);
  174.                         JobTimePlace(doc, k);

  175.                         for (int i = 0; i < jobItemSize; i++) {
  176.                                 map = new HashMap<String, String>();
  177.                                 map.put("title", JobItemTitle[i]);
  178.                                 map.put("time", timePlace[i]);
  179.                                 map.put("joblink", JobItemHref[i]);
  180.                                 tmpList.add(map);
  181.                         }
  182.                         return tmpList;
  183.                 } else {
  184.                         return null;
  185.                 }
  186.         }
  187.         
  188.         public void JobTimePlace(Document doc, int i) {
  189.                 
  190.         }

  191.         public int JobItem(Document doc, int i) {
  192.                 
  193.         }

  194. }
复制代码
ContentFragment0.java主要代码(viewpager中4个fragment其中的一个)如下:
  1. public class ContentFragment0 extends Fragment {
  2.         
  3.         private List<Map<String, String>> list;
  4.         private ListView mListView;
  5.         private JobListViewAdapter adapter;
  6.         
  7.         @Override
  8.         public View onCreateView(LayoutInflater inflater, ViewGroup container,
  9.                         Bundle savedInstanceState) {
  10.                 Constant.view = inflater.inflate(R.layout.job_fragment_layout, null);
  11.                 mListView = (ListView) Constant.view.findViewById(R.id.list);
  12.                 Constant.mFragmentActivity = getActivity();
  13.                 
  14.                 mListView.setOnItemClickListener(new OnItemClickListener() {

  15.                         @Override
  16.                         public void onItemClick(AdapterView<?> parent, View view,
  17.                                         int position, long id) {
  18.                                 // TODO Auto-generated method stub
  19.                         
  20.                         }
  21.                 });

  22.                 if (getList()!=null) {
  23.                         adapter = new JobListViewAdapter(getActivity(), getList());
  24.                         mListView.setAdapter(adapter);
  25.                 } else {
  26.                         System.out.println("contentfragment0***getList() is null");
  27.                 }
  28.                 
  29.                 return Constant.view;
  30.         }

  31. }
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8878次
    • 积分:173
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:41篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论