2012-05-05 3 views
1

주제별로는 Fragments 및 ActionBar를 사용하여 스 와이프 할 수있는 탭을 구현하려고합니다. 필자는 ActionBarSherlock과 TabsAdapter 클래스 (FragmentPageAdapter의 하위 클래스)를 사용하는 예제 코드를 사용하여 성공적으로 이식했습니다. 조각 중 일부는 동일한 탭 spor에 새 탭을 표시 할 수 있어야하며 여기에서 문제가 발생합니다. 호출기의 조각을 새 것으로 바꾸는 방법을 실제로 알 수는 없습니다. 나는 봤고 많은 것들을 시도했다.Swipable and replacable tabs, Fragments and ActionBar

FragmentPageAdapter 내부에서 프래그먼트 클래스를 포함하는 내부 콜렉션의 프래그먼트를 재배치 할 수 있으므로 새 프래그먼트를 getItem 메소드에서 사용할 수있게 만들지 만 호출기를 업데이트하는 방법을 알 수 없기 때문에 새 프래그먼트를 사용할 수 없습니다. 새 단편을 보여줍니다. 다른 탭으로 전환하고 돌아가더라도 여전히 페이저에서 어딘가에 캐시되고있는 오래된 조각이 생깁니다. 호출기에 대한 업데이트를 알리는 방법이 있습니까?

아마도 FragmentPageAdapter를 사용하는 것을 잊어 버려야할까요? 이 경우이 모든 기능을 수행하는 올바른 방법은 무엇입니까?

P. 내 코드를보고 싶다면 예제와 기본적으로 같고 문제는 좀 더 일반적이라고 생각합니다.

답변

0

ViewPager을 사용하면 페이지/조각을 메모리에 표시합니다/조각을 탐색 할 수 있습니다. 이 외에도 ViewPagerFragmentPagerApdapter을 사용하는 경우 활동 기간 동안 메모리에 뷰를 유지합니다.

나는 당신에게 비슷한 게시물을 여기에서 찾을 수있는 단편을 제거하고 대답했다. 당신의 경우는 이것을 확장하고 다른 것을 제거한 다음 추가하는 것입니다.

https://stackoverflow.com/a/10399127/629555

는 기본적으로, 당신은 PagerAdapter.POSITION_NONE을 반환하고 당신이 그것을 변경하고자 할 때 당신이 당신의 어댑터에 .notifyDataSetChanged(); 전화를 확인하는 getItemPosition 메소드를 오버라이드 (override)하는 FragmentStatePagerAdapter를 사용해야합니다.

위의 링크에 대한 답변은이 내용을 훨씬 자세하게 다루며 코드 예제를 제공합니다.

+0

감사합니다, 나는 그것을 밖으로 시도하고 그것을 작동합니다! 그러나 FragmentStatePagerAdapter를 사용하면 조각이 스위치/스 와이프 때마다 다시로드되거나 여전히 메모리에 유지되고 notifyDataSetChanged가 호출 될 때 다시로드된다는 의미입니까? – user1293081

+0

'FragmentStatePagerAdapter'는 스 와이프 때마다 언로드 /로드됩니다. 'Fragment'와 관련된'PagerAdapter'를 통해 처리 능력과 메모리 사이의 절충안입니다. – Louth

+0

FragmentPageAdapter를 사용하고 수동으로 강제로 다시로드하는 방법은 없습니다. 그것을 더 부드럽게 만들 것입니다. – user1293081

0

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; 
    } 
} 
+0

질문에 새 정보를 추가하는 경우 새 대답을 추가하지 말고 질문을 편집해야합니다. – BoltClock

+0

나는 같은 질문으로 그것을 실제로 보지 못했습니다. 첫 번째 질문은 해결책을 요구하고 두 번째는 해결책입니다 (나는 어떤 반응을 원합니다). – user1293081