1

ViewPager에서 조각을 대체하려고하는데 며칠 동안 수정할 수없는 문제가 있습니다. 나는 그것을 이해 관련 코드와 특정 문제는 아래에 설명되어 있습니다 :ViewPager가 프래그먼트를 업데이트하지 않습니다.

public class ViewPageAdapter extends FragmentStatePagerAdapter { 
int mNumOfTabs; 
FragmentManager mFragmentManager; 
Fragment0 currentFragment0; 
Fragment1 currentFragment1; 
Fragment2 currentFragment2; 
boolean getItemNeverCalled = true; 

public ViewPageAdapter(FragmentManager fm, int numOfTabs){ 
    super(fm); 
    mFragmentManager = fm; 
    this.mNumOfTabs = numOfTabs; 
} 

@Override 
public Fragment getItem(int position){ 
    switch (position){ 
     case 0: 
      if(currentFragment0 == null){ 
       Fragment0 tab0 = new Fragment0(); 
       currentFragment0 = tab0; 
       return currentFragment0; 

      } 
      else { 
       mFragmentManager.beginTransaction().remove(currentFragment0).commit(); 
       int value = selectedPlant.getMoistureFrag().getStat().getOptimalLevel(); 
       currentFragment0 = Fragment0.newInstance(key0, value); 
       notifyDataSetChanged(); // calls getItem(0). 

       return currentFragment0; 
      } 
     case 1: 
      if(currentFragment1 == null){ 
       LightFragment tab1 = new Fragment1(); 
       currentFragment1 = tab1; 

       return currentFragment1; 
      } 
      else { 
       mFragmentManager.beginTransaction().remove(currentFragment1).commit(); 
       int value = selectedPlant.getLightFrag().getStat().getOptimalLevel(); 
       currentFragment1 = currentFragment1.newInstance(key1, value); 
       notifyDataSetChanged(); 

       return currentFragment1; 
      } 
     case 2: 
      if(currentFragment2 == null){ 
       Fragment2 tab2 = new Fragment2(); 
       currentFragment2 = tab2; 

       return currentFragment2; 
      } 
      else { 
       mFragmentManager.beginTransaction().remove(currentFragment2).commit(); 
       int value = selectedPlant.getTempFrag().getStat().getOptimalLevel(); 
       currentFragment2 = Fragment2.newInstance(key2, value); 
       notifyDataSetChanged(); 

       return currentFragment2; 
      } 

     default: 
      return null; 
    } 
} 



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

@Override 
public int getItemPosition(Object object){ 
      return POSITION_NONE; 
} 

나는 항상 POSITION_NONE를 반환하는 getItemPosition(Object object) 방법을 오버라이드 (override) 한, 그리고 notifyDataSetChanged라는() (내가 생각하는) 적절한 경우. 무슨 일이 일어나는지는 notifyDataSetChanged()가`notifyDataSethanged() ... '를 호출하는 getItem(0)으로 호출된다는 것입니다. 이로 인해 TransactionTooLargeException이 발생하고 응용 프로그램이 충돌합니다.

각각의 경우 if/else 문에 배경을 제공하기 만하면 if은 빈 모이스처/라이트/기타 조각을 화면에로드합니다. 이는 시동시 발생하기위한 것입니다. else 문은 일부 데이터가있는 탐색 서랍의 항목을 사용자가 누를 때 실행됩니다. 그런 다음이 데이터를 추출하여 초기 빈 조각을 대체 할 조각에 대한 인수로 설정합니다.

나는 정말 감사드립니다. 이 문제는 나를 미치게합니다.

답변

1

전 세계에서 왜 이전 조각을 업데이트 할 수있을 때 조각을 재현하고 있습니까?
또한 getItem 중 notifyDataSetChanged를 호출 할 때 새 호출을 강제 실행하는 getItem에 대한 새 호출을 강제로 수행하므로 실제로 순환 호출이 생성됩니다!
각 위치에 항상 동일한 조각 클래스를 유지하고 조각에 붙들고 있기 때문에 조각을 대체하면 안됩니다. 보유하고있는 프래그먼트를 변경하여 새 값을 표시하십시오. 사용중인 코드는 위치에 대해 다른 조각 클래스를 변경하려는 경우에만 필요합니다.

+0

처음에는 (그 방법이 존재한다는 것을 알기 전에) 몇 가지 문제가 있었기 때문에 http://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpager와 같은 것을 제안한 여러 게시물을 따라갔습니다. . 나는 그것이 어떻게 진행되는지 알려줄 것이다. –

+0

BTW, 각 위치에 항상 동일한 조각 클래스를 유지하고 조각을 잡고 있기 때문에 코드를 다시 디자인해야합니다. 조각을 대체하면 안되며, 새로운 값을 표시하기 위해 보유하고있는 조각을 변경하면됩니다. 사용중인 코드는 위치에 대해 다른 조각 클래스를 변경하려는 경우에만 필요합니다. – lionscribe

+0

알았어. 즉, 시작시 탭을 초기화하지 않고 getItem 메소드를 사용하면 안됩니까? –

관련 문제