2013-05-12 103 views
0

我正在使用傑克·沃頓的ViewPagerIndicator來製作可滑動的選項卡。目前,我可以使它在我的應用程序中運行,並帶有4個選項卡。但顯然,當我更改頁面/選項卡時,每個片段都會重新創建。例如,如果我處於選項卡A中,切換到選項卡C並返回到選項卡A,則A選項卡的片段會再次重新創建,而不僅僅是將舊選項放到頁面的前面。ViewPagerIndicator - 如何避免每次返回時在片段中重新加載數據

我嘗試關注該庫的示例。這裏是我的代碼看起來是這樣的:

ProfileViewPagerActivity

private static final String[] TAB_TITLES = new String[] { "Info", 
     "Personal Event", "Favorite", "Attending" }; 

TestFragmentAdapter mAdapter; 
ViewPager mPager; 
PageIndicator mIndicator; 
int action; 
User user; 

@Override 
protected void onCreate(Bundle arg0) { 
    // TODO Auto-generated method stub 
    super.onCreate(arg0); 
    setContentView(R.layout.simple_tabs); 
    action = getIntent().getIntExtra(Constants.LOAD_WHAT, Constants.LOAD_MY_PROFILE); 
    user = (User) getIntent().getSerializableExtra(Constants.USER); 
    mAdapter = new TestFragmentAdapter(getSupportFragmentManager()); 

    mPager = (ViewPager) findViewById(R.id.pager); 

    mPager.setAdapter(mAdapter); 

    mIndicator = (TabPageIndicator) findViewById(R.id.indicator); 
    mIndicator.setViewPager(mPager); 
} 

這裏是適配器內部ProfileViewPagerActivity

TestFragmentAdapter

private int mCount = TAB_TITLES.length; 


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


    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
     case 0: 
      return UserInfoFragment.newInstance(action,user); 

     case 1: 
      return EventListFragment.newInstance(user.getUsername(), Constants.LIST_MINE, action); 

     case 2: 
      return EventListFragment.newInstance(user.getUsername(), Constants.LIST_FAVORITE, action); 

     case 3: 
      return EventListFragment.newInstance(user.getUsername(), Constants.LIST_ATTENDED, action); 
     } 
     return null; 

    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return TAB_TITLES[position].toUpperCase(Locale.US); 
    } 

使用上面的代碼,該片段每次都會重新創建自己更改選項卡。我試着做一個不同的方法,比如爲TestFragmentAdapter構造函數中的每個片段調用newInstance()方法,然後調用我已經在getItem方法中擁有的片段對象,但它仍然不起作用。

我已經嘗試過的另一個解決方案是saveInstanceState在每個片段中,但不起作用。我錯過了什麼嗎?提前致謝。

編輯

對不起,我的錯誤,我想這不是「重新實例片段」相關的問題。在進行了更多的調試之後,我發現只有在FragmentAdapter中顯示片段的情況下才會重新載入數據。在我的片段中,我從OnCreateView方法中的Web服務器加載數據。從Android文檔,我想我應該加載數據,我需要在OnCreate方法來解決這個問題,我是對嗎?謝謝。

+0

根據我更新的問題,我在下面的答案中考慮@Neoh評論是更正的答案。 – bangandi 2013-05-26 00:18:29

回答

0

從Android開發人員websiteFragmentPagerAdapter用戶訪問的每個頁面的片段將保留在內存中,儘管其視圖層次結構在不可見時可能會被破壞。

我相信android有它自己的機制來保存內存。如果你不相信,你可以隨時首先要聲明的片段:

private int mCount = TAB_TITLES.length; 

private UserInfoFragment fragment0; // first fragment 
private EventListFragment [] fragmentAt; // fragment 2,3,4 

@Override 
protected void onCreate(Bundle arg0) { 

    fragmentAt = new EventListFragment[mCount-1]; 
    ... 
} 

然後在您的TestFragmentAdapter

@Override 
public Fragment getItem(int position) { 

    switch (position) { 
    case 0: 
     if(fragment0 == null) { 
      fragment0 = UserInfoFragment.newInstance(action,user); 
     } 
     return fragment0; 

    case 1: 
    case 2: 
    case 3: 
     if(fragmentAt[position-1] == null) { 
      fragmentAt[position-1] = EventListFragment.newInstance(user.getUsername(), Constants.LIST_ATTENDED, action); 
     } 
     return fragmentAt[position-1]; 
    } 
} 

這樣,片段保證只創建一次。

+0

我已經試圖實現上面給出的代碼,就像我之前所說的「我試着做一個不同的方法,比如爲TestFragmentAdapter構造函數中的每個片段調用newInstance()方法,然後調用我已經在getItem中擁有的片段對象方法,它仍然無法正常工作。「 – bangandi 2013-05-12 07:48:49

+0

什麼仍然不起作用?當您滑動頁面時,必須調用getItem(),但至少該片段不會再次被重新實例化。 – Neoh 2013-05-12 07:54:31

+0

我很抱歉,我的錯誤。我編輯了我的問題。請大家看看,也許你對我有一個建議,@Neoh。謝謝。 – bangandi 2013-05-12 08:11:29

0

你可以試着讓你的TestFragmentAdapter延伸FragmentPagerAdapter

相關問題