2014-11-23 67 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

相關問題