2013-05-12 1 views
0

Jake Wharton의 ViewPagerIndicator을 사용하여 스 와이프 할 수있는 탭을 만듭니다. 현재 나는 그것에서 4 개의 탭과 함께, 내 애플 리케이션에서 작동하도록 만들 수 있습니다. 하지만 분명히 각 조각은 페이지/탭을 변경할 때 다시 생성됩니다. 예를 들어, 탭 A에 있고 탭 C로 변경 한 다음 탭 A로 돌아 가면 A 탭의 단편이 이전 페이지를 페이지 앞으로 가져 오는 것이 아니라 다시 다시 작성됩니다.ViewPagerIndicator - 반환 될 때마다 조각에서 데이터를 다시로드하는 것을 피하는 방법

나는 도서관의 예를 따르려고한다. 여기처럼 내 코드는 모습입니다 :

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); 
    } 

위의 코드를 사용 ProfileViewPagerActivity

내부 클래스와 어댑터

TestFragmentAdapter가

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); 
} 

하고, 이 조각은 내가 다시 만들 때마다 변경 탭. TestFragmentAdapter 생성자 안에있는 각 조각에 대해 newInstance() 메서드를 호출하고 getItem 메서드에 이미있는 조각 개체를 호출하는 등 다른 방법을 시도합니다. 여전히 작동하지 않습니다.

이미 시도한 또 다른 해결책은 각 조각에 saveInstanceState를 저장하는 것입니다. 그러나 역시 작동하지 않습니다. 내가 놓친 게 있니? 미리 감사드립니다.

편집

미안 해요, 내 실수, 내가 그것을 관련 질문에 "조각을 다시 인스턴스화"아니에요 같아요. 더 많은 디버깅을 한 후, 조각 만 FragmentAdapter에 표시된 경우 데이터 만 다시로드된다는 것을 알았습니다. 내 조각, 내가 OnCreateView 메서드에서 웹 서버에서 데이터를로드합니다. 안드로이드 워드 프로세서에서 내가이 문제를 해결하기 위해 OnCreate 메서드에서 필요한 데이터를로드해야한다고 생각합니다. 맞습니까? 감사.

+0

내 업데이트 된 질문에 따라, 나는 아래의 그의 답변에서 @ 네오 주석을 해결 답변입니다. – bangandi

답변

0

Android 개발자 website (FragmentPagerAdapter) : 사용자가 방문하는 각 페이지의 조각은 보이지 않을 때보기 계층 구조가 파괴 될 수 있지만 메모리에 보관됩니다.

나는 안드로이드가 메모리를 보존하는 자체 메커니즘을 가지고 있다고 믿습니다. 당신이 확신하지 않는 경우, 당신은 항상 먼저 조각을 선언 할 수 있습니다 : 다음

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

+0

아직 작동하지 않는 것은 무엇입니까? 페이지를 스 와이프 할 때'getItem()'을 호출해야하지만 적어도 조각은 다시 인스턴스화되지 않습니다. – Neoh

+0

죄송합니다. 실수입니다. 내 질문을 편집했습니다. 제발, 어쩌면 당신은 나를 위해 조언을 가지고, @ 네오. 감사. – bangandi

0

TestFragmentAdapter가 FragmentPagerAdapter으로 확장 될 수 있습니다.

관련 문제