0

[FragmentStatePagerAdapter 만 전하 페이지

"메모리 사용량을 최소화하는이. 미정 인 페이지 번호에 대한 오브젝트의 컬렉션을 통해 페이징을위한 더 나은 사용자가 다른 페이지로 이동으로 조각을 파괴"FragmentStatePagerAdapter 사용시

이 FragmentStatePagerAdapter는 다음과 같이 작동합니다. 0 위치를 처음로드 할 때 수행되는 작업은로드 페이지 0으로, 페이지 1로 넘어갈 경우 페이지 3이로드되고 3 페이지가로드되고 이후에 (현재 위치). 실제 위치의 뒷면 탭으로 이동해도 뷰를 캐시하면 데이터가 다시로드되지 않습니다. 내 문제 이 동작에서 실제 뷰의 왼쪽 및 오른쪽보기가 캐시되어있는 것처럼 보입니다. , FragmentStatePagerAdapter이 PageAdapter을 상속이 클래스를 수정 언급 인터넷 접속 옵션을 찾을 수 생략이 동작

당신이 명확하지 않은 유래에있는 대답은, 내가 만약에 사람이 할 수있는하시기 바랍니다 5 일 동안이 문제가 해결되지 내가 어떻게 그것을 해결할 수 있는지 설명하도록 도와주세요, 나는 무한히 행복 할 것입니다. 아마 당신이 예상대로 작동하지 않습니다 [

//의 getItem FragmentStatePagerAdapter 캐시를 지 웁니다 사용자 정의 클래스는 가정으로 FragmentStatePagerAdapter 캐시를 지 웁니다 사용자 정의 클래스 (다만 현재의 단편을 팽창)

public class CostumAdapter extends FragmentStatePagerAdapter { 

     public CostumAdapter(FragmentManager fm) { 
      super(fm); 

     } 

     @Override 
     public Fragment getItem(int position) { 
      System.out.println("POSICION: "+position); 
      Bundle bundle = new Bundle(); 
      FragmentBebidas fragmentBebidas = new FragmentBebidas(); 
      bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId())); 
      fragmentBebidas.setArguments(bundle); 

      return fragmentBebidas; 

     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return menuTabs.get(position).toString(); 
     } 

     @Override 
     public int getCount() { 
      return menuTabs.size(); 
     } 

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

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      super.destroyItem(container, position, object); 

     } 
    } 

enter image description here

주위에 일이 여기에있다

enter image description here

+0

원하는 것을 지우지 마십시오! –

+0

선택한 위치의 뒤쪽 탭이 캐싱되어 돌아 왔을 때 탭 데이터가 더 이상 작동하지 않습니다. 나는 단지 현재 선택된 탭의 데이터를 업데이트하려고하지만, 다른 탭의 데이터는 업데이트하지 않으므로 각각의 탭에 대해 @ecishiajethava –

답변

0

, 을 사용하여 ViewPager에 의해 생성 된 조각을 유지할 수 있습니다. 난 당신이 사용자에게 표시되는 특정 조각의 데이터를 새로 고칠 필요가 가정

public class CustomAdapter extends StateSaveFragmentAdapter { 

    public ProjectDetailFragmentAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public int viewPagerId() { 
    // your viewpager id 
     return R.id.pager; 
    } 

    @Override 
    public Fragment getItem(int position) { 
    // check if fragment was saved 
     if (getSavedFragment(position) != null) 
     return getSavedFragment(position); 

    // if save fragment was null, continue with normal implementation   
    FragmentBebidas fragmentBebidas = new FragmentBebidas(); 
     bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId())); 
     fragmentBebidas.setArguments(bundle); 
    return fragmentBebidas; 
    } 

    @Override 
    public int getCount() { 
    // your implementation 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     // your implementation 
    } 
} 
+0

@Rakeeb Rajbhandari를 즉시 증명할 것입니다. –

+0

하지만 저장하고 싶지 않습니다. 이전 것들의 상태, 나는 단지 선택한 조각 중 하나를 원한다. 아마도 두 번째 이미지와 혼란 스럽다. 그냥 다른 조각을로드하고 싶지 않다. 단지 선택된 페이지를로드하고 싶다. 그래서 각각 하나만 선택된 것입니다. 설명 : –

+0

동작은 동일하게 유지됩니다. @Override 공공 무효 setUserVisibleHint (부울 isVisibleToUser) { 슈퍼 : –

0

@Isa M :

abstract 클래스를

public abstract class StateSaveFragmentAdapter extends FragmentPagerAdapter { 

    public FragmentManager fragmentManager; 

    public StateSaveFragmentAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
     this.fragmentManager = fragmentManager; 
    } 

    public abstract int viewPagerId(); 

    public Fragment getSavedFragment(int position) { 
     return fragmentManager.findFragmentByTag(frameworkFragmentName(viewPagerId(), 
       getItemId(position))); 
    } 

    private String frameworkFragmentName(int viewId, long id) { 
     return "android:switcher:" + viewId + ":" + id; 
    } 
} 

어댑터가 보일 것 같은 뭔가를 확장 할 수 있습니다. 이를 위해 setUserVisibleHint() 메서드를 사용할 수 있습니다. 부울 변수는 조각이 사용자에게 표시되는지 여부를 알려줍니다. 해당 블록에 필요한 코드를 수행하는 경우.

+0

당신은 여기 –

+0

매우 감사하다 코드입니다 해결하기 위해 당신의 생각에서 그 코드의 조각을 가지고있다.setUserVisibleHint (isVisibleToUser); if (isVisibleToUser) { // 여기에서 작업하십시오 } } – Aditi