0

[FragmentStatePagerAdapterだけ充電ページ

「メモリ使用量を最小限に抑える。これは。未定義でページ数のためのオブジェクトのコレクションをページネーションのための優れているユーザーは他のページに移動するよう断片を破壊し、」FragmentStatePagerAdapterを使用している場合

このFragmentStatePagerAdapterは次のように動作します。最初に0の位置を読み込んだときの動作は、ロード ページ0に、ページ1に移動するとページ3が読み込まれ、ページ3がロードされます。現在位置)。 実際の位置の後ろのタブに移動してもデータを再度ロードしないと、ビューをキャッシュすると問題が発生します この動作では、実際のビューの左右のビューがキャッシュされているようですが、 、 FragmentStatePagerAdapterはPageAdapterを継承し、このクラスを変更するに言及するには、インターネットアクセスのオプションを見つける 省略この動作

あなたは明らかにされていないのStackOverflowで見つかった答えは、私がした場合、誰かがすることができますしてください、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

選択した位置の後ろのタブがキャッシュされていて、戻ってもタブのデータは機能しなくなります。私はちょうど選択されたタブのデータを更新したいのですが、他のタブのデータは更新しないようにしたいので、それぞれのタブで瞬時に確認してください@Kishore Jethava –

答えて

0

これに対する回避策はありますが、 ViewPagerによって作成されたフラグメントを保持するには、FragmentManagerを使用できます。

はあなたのアダプタは、このようなものになるはずです。この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; 
    } 
} 

拡張:

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

しかし、以前のものの状態、私は選択されたフラグメントの1つだけを必要とし、おそらく2番目のイメージとの混乱があります。 私はちょうど選択された他のフラグメントをロードしません、選択されたものだけがそれぞれ1つずつ表示されます。私は説明する –

+0

動作は同じままです。 @Override 公共ボイドsetUserVisibleHint(ブールisVisibleToUser){ スーパー: –

0

@Isa Mを私はあなたがユーザーに表示されている特定のフラグメントのデータをリフレッシュするために必要とします。そのためにsetUserVisibleHint()メソッドを使用できます。ブール変数では、フラグメントがユーザーに表示されているかどうかを知ることができます。 そのブロックに必要なコードがある場合。

+0

あなたがここに –

+0

非常に感謝して解決するために、あなたのアイデアからそのコードのスニペットを、持っているコードです。setUserVisibleHint(isVisibleToUser); if(isVisibleToUser){ //ここであなたの仕事をしてください } } – Aditi

関連する問題