[英]Swipable and replacable tabs, Fragments and ActionBar
正如主題所述,我正在嘗試使用Fragments和ActionBar實現可滑動選項卡。 我已經使用ActionBarSherlock和來自帶有TabsAdapter類(FragmentPageAdapter的子類)的示例中的代碼成功實現了它。 某些片段應該能夠在同一選項卡中顯示一個新的選項卡,這就是問題所在。 我真的不知道如何用新的替換尋呼機中的一個片段。 我用谷歌搜索並嘗試了很多東西。
我可以替換包含FragmentPageAdapter內的fragments類的內部集合中的fragment,從而使新的Fragment可用於getItem方法,但這不能實現,因為我不知道如何更新尋呼機以顯示新的分段。 即使切換到另一個Tab並返回后,我仍然會得到舊的Fragment,我認為它是由尋呼機緩存在某個地方的。 那么有沒有辦法通知尋呼機更新呢?
也許我應該忘記使用FragmentPageAdapter? 在那種情況下,實現所有這些功能的正確方法是什么?
PS:如果您想查看我的代碼,請告訴我,但是它與示例中的代碼基本相同,並且我認為問題更籠統
使用ViewPager
時,除了可以瀏覽的頁面/片段外,它ViewPager
可見的頁面/片段保留在內存中。 除此之外,如果ViewPager
使用FragmentPagerApdapter
它將在活動期間將視圖保留在內存中。
我回答了與您上面類似的帖子,刪除了可以在此處找到的片段。 您的案例是對此的擴展,刪除然后添加其他內容。
https://stackoverflow.com/a/10399127/629555
基本上,您需要使用FragmentStatePagerAdapter
,重寫getItemPosition
方法以返回PagerAdapter.POSITION_NONE
並確保您調用.notifyDataSetChanged();
在適配器上更改時。
上面鏈接的答案對此進行了更詳細的介紹,並提供了代碼示例。
如何使用FragmentStatePagerAdapter自己對適配器中的片段進行引用呢? 然后,我既將它們保存在內存中,又可以完全控制刪除。 這種方法有什么不好的地方嗎?以后我會遇到問題嗎? 另外,我也進行了更改,以便將片段作為對象而不是類傳遞,從而將啟動保留在尋呼機之外。 有什么問題嗎?
附上我的適配器代碼:
public static class TabsAdapter extends FragmentStatePagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<Fragment> mTabs = new ArrayList<Fragment>();
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Fragment fragment) {
tab.setTag(fragment);
tab.setTabListener(this);
mTabs.add(fragment);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
public void replaceTab(ActionBar.Tab tab, Fragment fragment, int position) {
tab.setTag(fragment);
tab.setTabListener(this);
mTabs.set(position, fragment);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
return mTabs.get(position);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.