0

私は 6 画面 (mViewPagerMain) を持つ ViewPager を持っています。画面 4 では、別の ViewPager (mViewPagerSub) の中に別の ViewPager があります。mViewPagerSub が使用されている場合、CustumViewPager で mViewPagerMain のスクロールを無効にします。ここでの問題: メイン ページをスクロールすると、すべて正常に動作し、すべてが読み込まれます。画面 4 (サブを含む) から画面 2 にスクロールして戻り、4 に戻ると、サブ内の最初の 2 つの画面が読み込まれません。サブで前後にスクロールすると、すべてが正しく読み込まれます。

作成時:

protected void onCreate(Bundle savedInstanceState) {
   mSectionsPagerAdapterMain = new SectionsPagerAdapterMain(getSupportFragmentManager());
   mSectionsPagerAdapterSub = new SectionsPagerAdapterSub(getSupportFragmentManager());
   mViewPagerMain = (CustomViewPager) findViewById(R.id.pagerMain);
   mViewPagerMain.setAdapter(mSectionsPagerAdapter);
}

SectionPagerAdapters: (Google の例と同様、サブも同じ)

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = null;
        switch (position) {
        case 0:
            fragment = new SettingsFragment(0);
            break;
        case 1:
            fragment = new SettingsFragment(1);
            break;
        case 2:
            fragment = new SettingsFragment(2);
            break;
        // and so on...
        default:
            fragment = new SettingsFragment(0);
        }
        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
        case 0:
            return getString(R.string.title_section1).toUpperCase();
        case 1:
            return getString(R.string.title_section2).toUpperCase();
        // and so on ...
        }
        return null;
    }
}

Settingsfragment: (Google の例のように)

public static class SettingsFragment extends Fragment {

    int position = 0;

    public SettingsFragment(int position) {
        this.position = position;

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView;
        if (position == 0) {
            rootView = inflater.inflate(R.layout.main0, container, false);
            main0(rootView);
            return rootView;

        } else if (position == 1) {
            rootView = inflater.inflate(R.layout.main1, container, false);
            main1(rootView);
            return rootView;
        } else if (position == 2) {
            rootView = inflater.inflate(R.layout.main2, container, false);
            main2(rootView);
            return rootView;
        } 
                    //...and so on...
    }

}

関連ページ: main4():

public static void main4(View rootView) {
    subView = rootView;
    new setAdapterTask().execute();
}

ページャーをロードする非同期タスク:

private static class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mViewPagerSub = (CustomViewPager)subView.findViewById(R.id.pagerSub);
        mViewPagerSub.setAdapter(mSectionsPagerAdapterSub);
        mViewPagerSub.refresh();
    }
}

CustomViewPager.refresh():

public void refresh() {
       getAdapter().notifyDataSetChanged();
}

スクロールをシミュレートするために、このような PageListener を使用しようとしましたが、効果はありませんでした。

private static class PageListener extends SimpleOnPageChangeListener {
        public void onPageSelected(int position) {
            currentPage = position;
            if (mViewPagerSub != null && currentPage == 3) {
                mViewPagerSub.setCurrentItem(5);
            } else if (mViewPagerSub != null && currentPage == 4) {
                mViewPagerSub.setCurrentItem(0);
            }
            if (mViewPagerSub != null)
                mViewPagerSub.refresh();
        }
}
4

1 に答える 1

1

私自身の質問に答える:これはうまくいきました:

private static class PageListener extends SimpleOnPageChangeListener {
   public void onPageSelected(int position) {
      currentPage = position;
      if(currentPage==4 && mViewPagerSub!=null){
         new setAdapterTask().execute();
      }
   }
}
于 2013-02-08T11:59:18.797 に答える