2014-11-23 72 views
0

这是几天我试图解决这个问题的方法。请帮帮我。android操作栏选项卡查看页面AsyncTask第一个选项卡在启动时为空

我使用与viewpager的选项卡导航。有四个片段。我使用异步任务来下载我需要放入视图中的数据。当应用程序启动时,第一个片段是空的。但是,当我刷到第二或第三,他们有数据。如果我从第二个滑动到第一个,它也有数据。所以我想我可能是有问题notifyDataSetChanged,但我试过了,它不工作。

MainActivity.java

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 

    final ActionBar actionBar = getActionBar(); 

    actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(false); 

    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setOffscreenPageLimit(1); 
    mViewPager.setAdapter(mAppSectionsPagerAdapter); 

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     //private ArrayList hasLoadedPages = new ArrayList<Integer>(); 
     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 
    for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 
     actionBar.addTab(
       actionBar.newTab() 
         .setText(mAppSectionsPagerAdapter.getPageTitle(i)) 
         .setTabListener(this)); 
    } 
    } 

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter { 


    public AppSectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 


    @Override 
    public Fragment getItem(int i) { 
     switch (i) { 
      //case 0: 
      // return new LaunchpadSectionFragment(); 

      default: 
       Fragment fragment = new DummySectionFragment(); 
       Bundle args = new Bundle(); 
       args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1); 
       fragment.setArguments(args); 
       return fragment; 
     } 
    } 

    @Override 
    public int getCount() { 
     return 4; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     String str=""; 
     if (position==0){ 
      str = "one"; 
     }else if(position==1){ 
      str = "two"; 
     }else if(position==2){ 
      str = "three"; 
     }else if(position==3){ 
      str = "four"; 
     } 
     return str; 
    } 

    @Override 
    public void notifyDataSetChanged() 
    { 
     super.notifyDataSetChanged(); 
    } 

} 

public static class DummySectionFragment extends Fragment { 

    public static final String ARG_SECTION_NUMBER = "section_number"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
    } 

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

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onActivityCreated(savedInstanceState); 
     Bundle args = getArguments(); 
     mCid = args.getInt(ARG_SECTION_NUMBER); 
     mNewsData = new ArrayList<HashMap<String,Object>>(); 
     mNewsList = (ListView)getView().findViewById(android.R.id.list); 
     mNewsListAdapter = new SimpleAdapter(this.getActivity(), mNewsData, R.layout.newslist_item, 
       new String[]{"newslist_item_title","newslist_item_digest","newslist_item_source","newslist_item_ptime"}, 
       new int[]{R.id.newslist_item_title,R.id.newslist_item_digest,R.id.newslist_item_source,R.id.newslist_item_ptime}); 
     View loadMoreLayout = this.getLayoutInflater(savedInstanceState).inflate(R.layout.loadmore, null); 
     mNewsList.setAdapter(mNewsListAdapter); 
     mNewsList.addFooterView(loadMoreLayout); 
     mNewsList.setOnItemClickListener(new OnItemClickListener() 
     { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       Intent intent = new Intent(getActivity(), NewsDetailsActivity.class); 
       startActivity(intent); 
       intent.putExtra("newsDate", mNewsData); 
       intent.putExtra("position", position); 
       startActivity(intent); 
      } 
     }); 
     mLoadMoreBtn = (Button)getView().findViewById(R.id.loadmore_btn); 
     mLoadMoreBtn.setOnClickListener(loadMoreListener); 

     loadNewsAsyncTask = new LoadNewsAsyncTask(); 
     loadNewsAsyncTask.execute(mCid,0,true); 
    } 
} 

private static class LoadNewsAsyncTask extends AsyncTask<Object, Integer, Integer> 
{ 

    @Override 
    protected void onPreExecute() 
    { 
     mLoadMoreBtn.setText(R.string.loadmore_txt); 
    } 

    @Override 
    protected Integer doInBackground(Object... params) 
    { 
     return getSpeCateNews((Integer)params[0],mNewsData,(Integer)params[1],(Boolean)params[2]); 
    } 

    @Override 
    protected void onPostExecute(Integer result) 
    { 
     switch (result) 
     { 
     case NONEWS: 
      mLoadMoreBtn.setText(R.string.no_news); 
      break; 
     case NOMORENEWS: 
      mLoadMoreBtn.setText(R.string.no_more_news); 
      break; 
     case LOADERROR: 
      mLoadMoreBtn.setText(R.string.load_news_failure); 
      break; 
     } 
     mNewsListAdapter.notifyDataSetChanged(); 
     mLoadMoreBtn.setText(R.string.loadmore_btn); 
    } 
} 
+0

我已经解决了这个问题 – mayi18 2014-11-24 13:21:55

+0

片段中的每个适配器应该是唯一的 – mayi18 2014-11-24 13:23:32

回答

0

您正在使用FragmentPagerAdapter请改为FragmentStatePagerAdapter并再次运行FragmentPagerAdapter和FragmentStatePagerAdapter

之间

差异关于FragmentPagerAdapter谷歌的指南说:

T他的版本的寻呼机最适合用于通常需要更多静态片段的页面,比如一组选项卡。用户访问的每个页面的片段将保存在内存中,尽管其视图层次结构在不可见时可能会被破坏。这可能导致使用大量的内存,因为片段实例可以保持任意数量的状态。对于更大的页面集,请考虑FragmentStatePagerAdapter。

而关于FragmentStatePagerAdapter:

这个版本的寻呼机的时候有大量的页面,变得更像一个列表视图是比较有用的。当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态。与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关联的少得多的存储器,代价是在页面之间切换时潜在的更多开销。

+0

我试过了,它不起作用 – mayi18 2014-11-24 11:32:00

相关问题