FragmentPagerAdapterの奇妙な振る舞い

だから私はFragmentPagerAdapterに次の問題があります。私は切り替えることができる3つのフラグメントを表す3つのタブを持つTabLayoutを持っています。だから私は3番目のフラグメントに切り替えると、何らかの理由で最初のもの(またはそのビュー)が消えます。誰もがこの問題を解決する方法を知っていますか?前もって感謝します。

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private static final int FRAGMENT_COUNT = 3;

private final List listOfFragments = new ArrayList<>();

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position);
}

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

public void addFragment(Fragment fragment) {
    listOfFragments.add(fragment);
}


}

これはFragmentPagerAdapterのコードです。

1
そして私はこれを修正したと思います:)私がしたことはFragmentPagerAdapter destroyItem()メソッドを空のボディで上書きすることだけです(スーパーではありません)。
追加された 著者 RadoVidjen,
そして私はこれを修正したと思います:)私がしたことはFragmentPagerAdapter destroyItem()メソッドを空のボディで上書きすることだけです(スーパーではありません)。
追加された 著者 RadoVidjen,
アダプタをバインドする場所にコードを表示してください。
追加された 著者 Rutvik Bhatt,

8 答え

そして私はこれを修正したと思います:)私がしたことはFragmentPagerAdapter destroyItem()メソッドを空のボディで上書きすることだけです(スーパーではありません)。

0
追加された

そして私はこれを修正したと思います:)私がしたことはFragmentPagerAdapter destroyItem()メソッドを空のボディで上書きすることだけです(スーパーではありません)。

0
追加された

ここでの問題の1つは、やや紛らわしいAPIです。

FragmentPagerAdapter では、 getItem(int position)は実際には「アイテムの作成」を意味します。つまり、アダプタのリスト内にフラグメントを手動でキャッシュしないでください。

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

直感に反するように見えるかもしれませんが、実際には getItem 内に必要なフラグメントの新しいインスタンスを作成する必要があります。これは、公式のGoogleの例に非常に密接に従います。

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

Otherwise you will run into problems where the FragmentManager's cache and your own List cache are out-of-sync. In short, caching of Fragments is handled by the FragmentManager and you don't need to roll-your-own caching.

0
追加された

ここでの問題の1つは、やや紛らわしいAPIです。

FragmentPagerAdapter では、 getItem(int position)は実際には「アイテムの作成」を意味します。つまり、アダプタのリスト内にフラグメントを手動でキャッシュしないでください。

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

直感に反するように見えるかもしれませんが、実際には getItem 内に必要なフラグメントの新しいインスタンスを作成する必要があります。これは、公式のGoogleの例に非常に密接に従います。

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

Otherwise you will run into problems where the FragmentManager's cache and your own List cache are out-of-sync. In short, caching of Fragments is handled by the FragmentManager and you don't need to roll-your-own caching.

0
追加された

I don't know what is your problem. but if in your app only 3 fragments are there than you can try setOffscreenPageLimit method of ViewPager

ViewPager.setOffscreenPageLimit(3);
0
追加された
コメントありがとうございます。問題は、何らかの理由で3つのフラグメントがあり、setCurrentItem(1)(2番目のフラグメントがデフォルトであることを意味します)と言った場合、最後のフラグメント(3番目)に進み、次に最初のフラグメントに戻るということです。最初のフラグメントはありません。何らかの理由で(または少なくともそのレイアウトで)削除されたように見えます。私のコメントで述べたように、私はFragmentPagerAdapterからdestroyItem()をオーバーライドすることでそれを修正しました。
追加された 著者 RadoVidjen,
いいですよ。他の誰かがこの質問にアクセスした場合、あなたの答えは彼らが彼の問題を解決するのに役立つでしょう
追加された 著者 Bhavesh Rangani,

I don't know what is your problem. but if in your app only 3 fragments are there than you can try setOffscreenPageLimit method of ViewPager

ViewPager.setOffscreenPageLimit(3);
0
追加された
コメントありがとうございます。問題は、何らかの理由で3つのフラグメントがあり、setCurrentItem(1)(2番目のフラグメントがデフォルトであることを意味します)と言った場合、最後のフラグメント(3番目)に進み、次に最初のフラグメントに戻るということです。最初のフラグメントはありません。何らかの理由で(または少なくともそのレイアウトで)削除されたように見えます。私のコメントで述べたように、私はFragmentPagerAdapterからdestroyItem()をオーバーライドすることでそれを修正しました。
追加された 著者 RadoVidjen,
いいですよ。他の誰かがこの質問にアクセスした場合、あなたの答えは彼らが彼の問題を解決するのに役立つでしょう
追加された 著者 Bhavesh Rangani,

何が起こるのか本当にわかりませんが、これが私のコードです。

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

これが私のタブレイアウトです。

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);
0
追加された

何が起こるのか本当にわかりませんが、これが私のコードです。

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

これが私のタブレイアウトです。

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);
0
追加された