6

Jake Wharton による viewpagerindicator があり、その viewpager には 6 つのページがあります。すべてのページにリストビューが含まれており、AsyncTask でそれらをロードしています。viewpager が間違ったインデックスで間違ったページを表示することがあります。

public class TestFragmentAdapter extends FragmentPagerAdapter{
    protected static final String[] CONTENT = new String[] { "a","b","c","d","e","f" };

    private int mCount = CONTENT.length;
    Fragment fragment1,fragment2,fragment3,fragment4,fragment5,fragment6;

    public TestFragmentAdapter(FragmentManager fm) {
        super(fm);
        fragment1 = new CategoryListView();
        fragment2 = CustomizedListviewRecent.newInstance(41);
        fragment3 = CustomizedListviewMostRecents.newInstance(0);
        fragment4 = CustomizedListviewPopulars.newInstance();
        fragment5 = CustomizedListviewRecent.newInstance(42);
        fragment6 = CustomizedListviewRecent.newInstance(43);

    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0)
            return fragment1;
        else if(position == 1)
            return fragment2;
        else if(position == 2)
            return fragment3;
        else if(position == 3)
            return fragment4;
        else if(position == 4)
            return fragment5;
        else
            return fragment6;
    }
    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
      return TestFragmentAdapter.CONTENT[position % CONTENT.length];
    }

    public void setCount(int count) {
        if (count > 0 && count <= 10) {
            mCount = count;
            notifyDataSetChanged();
        }
    }

}

ビューページャーを作成する方法は次のとおりです。

public class SampleTitlesDefault extends BaseSampleActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mAdapter = new TestFragmentAdapter(getSupportFragmentManager());

        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);
        mIndicator.setCurrentItem(1);
    }

}

ここで何が問題になる可能性がありますか?どうすれば解決できますか?助けてくれてありがとう

4

2 に答える 2

2

遅すぎることはわかっていますが、誰かがそれを必要としているかもしれません。

私も間違った位置に関する同様の問題に直面しており、間違った位置が原因​​で2つのフラグメントで同じ結果が表示されることがFragmentPagerAdapterあります。FragmentStatePagerAdapter

また、インターフェイスonPageScrolledを使用してメソッドからインデックス位置をOnPageChangeListener渡しました

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {


        }

        @Override
        public void onPageSelected(int position) {

            bundle = new Bundle();
            bundle.putInt("position", position);
            primaryFragment.setCurrentPostionAndData(position);

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

ドキュメントが言うように、このように考えてください。ブック リーダーのようなアプリケーションを実行する場合、すべてのフラグメントを一度にメモリにロードする必要はありません。ユーザーが読み取ったときにフラグメントをロードして破棄したいとします。この場合、FragmentStatePagerAdapter を使用します。大量のデータ (ビットマップなど) を含まない 3 つの「タブ」を表示するだけの場合は、FragmentPagerAdapter が適している可能性があります。また、ViewPager はデフォルトで 3 つのフラグメントをメモリにロードすることに注意してください。あなたが言及した最初のアダプターは、ビュー階層を破棄し、必要に応じて再ロードする可能性があります。2番目のアダプターは、フラグメントの状態のみを保存し、完全に破棄します。ユーザーがそのページに戻った場合、状態が取得されます。

FragmentPagerAdapter と FragmentStatePagerAdapter の違い

于 2016-05-12T08:05:11.680 に答える
0

s を自分で「キャッシュ」しないFragmentでください。既にキャッシュされているためです。

つまり、アダプターを作成するときではなく、メソッドnewInstance内でそれらを使用する必要があります。例:getItem

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

@Override
public Fragment getItem(int position) {
    if(position == 0)
        return new CategoryListView();
    else if(position == 1)
        return CustomizedListviewRecent.newInstance(41);
    else if(position == 2)
        return CustomizedListviewMostRecents.newInstance(0);
    else if(position == 3)
        return CustomizedListviewPopulars.newInstance();
    else if(position == 4)
        return CustomizedListviewRecent.newInstance(42);
    else
        return CustomizedListviewRecent.newInstance(43);
}

これを行う一般的な理由は次のとおりです。

  1. 人々は、そのようにした方が効率的だと考えています。また
  2. への参照Fragmentが後で必要になる場合があります。

(1)については、私が言ったように、心配する必要はありません(学習して後で微調整したい場合を除きますが、今はそのままにしておいてください). (2) が必要な場合は、これを行うことができます(元はここに表示されています)。

于 2013-01-28T01:31:42.733 に答える