3

デザイン サポート ライブラリの新しい TabLayout を含む画面があります。フラグメントを表示するために使用される ViewPager もあります。このフラグメントは、選択されたタブに応じて異なるビューのリストを表示します。

アプリはネットワーク呼び出しへの応答を受け取ります。私のアクティビティは、ViewPager に属する FragmentPagerAdapter を、応答によって返されたデータで更新します。私の場合、これは 3 つのリストです。

私の ViewPager ではonPageChangeListener()、ページが選択されたことを検出するために をオーバーライドしてから、新しいタブ位置で FragmentPagerAdapter を呼び出します。notifyDataSet()ビューを再描画するためにも呼び出します。

getItemPosition()Fragment に渡すリストを決定するメソッドをオーバーライドします。しかし、私はこれが正しい方法だとは思いませんgetItemPosition。このメソッドは、実際には各フラグメントを同じ結果リストで更新しています。次のタブにスクロールすると、スクロールが解放されるまで現在のリストが次のタブに表示され、フラグメントは正しいリストで再描画されます。

私の質問は、ViewPager Fragments にリストを表示するための正しいアプローチをとっていますか? それとも、物事を真剣に複雑にしすぎていますか? 私は ViewPagers または FragmentPagerAdapters の経験があまりないので、どんな意見でも大歓迎です。

私のコードは以下の通りです。

フラグメントの追加 (から呼び出されるonResume())

private void addFragment() {

    mViewPager = (ViewPager) findViewById(R.id.viewpager);

    mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),
            SampleActivity.this);

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(final int i, final float v, final int i2) {
        }
        @Override
        public void onPageSelected(final int i) {
            mMyPagerAdapter.updateTabPosition(i);
        }
        @Override
        public void onPageScrollStateChanged(final int i) {
        }
    });

    mViewPager.setAdapter(mMyPagerAdapter);
    mViewPager.setOffscreenPageLimit(1);

    mTabLayout = (TabLayout) findViewById(R.id.my_tab_layout);
    mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    mTabLayout.setTabMode(TabLayout.MODE_FIXED);
    mTabLayout.setupWithViewPager(mViewPager);

    if (shouldMakeNetworkCall()) {
        getLists();
    }
}

ViewPager FragmentPagerAdapter クラス

public class MyFragment extends FragmentPagerAdapter {

private Context mContext;
final int PAGE_COUNT = 3;
private String tabTitles[] = new String[] { "One", "Two", "Three" };
private List<MyListType> mListOne;
private List<MyListType> mListTwo;
private List<MyListType> mListThree;
private int mTabPosition;

public MyPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    mContext = context;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return MyFragment.newInstance(mListOne);
        case 1:
            return MyFragment.newInstance(mListTwo);
        case 2:
            return MyFragment.newInstance(mListThree);
        default:
            return null;
    }
}

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

@Override
public CharSequence getPageTitle(int position) {
    // Generate title based on item position
    return tabTitles[position];
}

@Override
public int getItemPosition(Object object) {
    if (object instanceof MyFragment) {

        switch (mTabPosition) {
            case 0:
                ((MyFragment) object).setupUI(mListOne);
                break;
            case 1:
                ((MyFragment) object).setupUI(mListTwo);
                break;
            case 2:
                ((MyFragment) object).setupUI(mListThree);
                break;
            default:
                break;
        }
    }
    return super.getItemPosition(object);
}


public void updateTabPosition(int tabPosition) {
    mTabPosition = tabPosition;
    notifyDataSetChanged();
}
}
4

1 に答える 1