Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测FragmentPagerAdapter显示的第一页或最后一页?_Java_Android_Fragmentpageradapter - Fatal编程技术网

Java 如何检测FragmentPagerAdapter显示的第一页或最后一页?

Java 如何检测FragmentPagerAdapter显示的第一页或最后一页?,java,android,fragmentpageradapter,Java,Android,Fragmentpageradapter,我有一个非常简单的设置配套应用程序(适用于可穿戴的手表),它使用大约8个滑动页面来设置单选按钮的一些选项。我使用根据所选选项实例化的各个片段 public class SectionsPagerAdapter extends FragmentPagerAdapter { ... @Override public Fragment getItem(int position) { // getItem is called to instanti

我有一个非常简单的设置配套应用程序(适用于可穿戴的手表),它使用大约8个滑动页面来设置单选按钮的一些选项。我使用根据所选选项实例化的各个片段

     public class SectionsPagerAdapter extends FragmentPagerAdapter {
 ...
         @Override
    public Fragment getItem(int position) {

        // getItem is called to instantiate the fragment for the given page.
        // Return a different static fragment depending on which menu item
        // It isn't called if we already have the given fragment available
        if ((position < 0) || (position >= mMenuItems.length)) return null;
        String menu = mMenuItems[position];

        //FIXME: We are setting the existing values when instantiated, which means they may not reflect
        //actual current values when the fragment is displayed
        if (menu.equals(getResources().getString(R.string.period_length))) {
            return PeriodLengthFragment.newInstance(menu, mPeriodLength);
        } else if (menu.equals(getResources().getString(R.string.home_team_color))) {
            return HomeTeamColorFragment.newInstance(menu);
        } else if (menu.equals(getResources().getString(R.string.away_team_color))) {
            return AwayTeamColorFragment.newInstance(menu);
        } else if (menu.equals(getResources().getString(R.string.number_of_periods))) {
            return NumberOfPeriodsFragment.newInstance(menu,mNumberOfPeriods);
        }  else if (menu.equals(getResources().getString(R.string.interval_length))) {
            return IntervalLengthFragment.newInstance(menu, mIntervalLength);
        } else if (menu.equals(getResources().getString(R.string.count_up_or_down))) {
            return CountUpOrDownFragment.newInstance(menu);
        } else if (menu.equals(getResources().getString(R.string.about))) {
            return AboutFragment.newInstance(menu);
        }  else if (menu.equals(getResources().getString(R.string.match_results))) {
            return MatchResultsFragment.newInstance(menu,mHomeTeamScore,mAwayTeamScore );
        }
        return null;
    }
不幸的是,尽管我可以在getItem方法中访问
位置
(并相应地更改fab的可见性),但这是在页面实例化时调用的,而不是在显示时调用的。因为PagerAdapter实例化了下一页和上一页,这导致晶圆厂被隐藏在错误的页面上


在PagerAdapter或FragmentPagerAdapter中,有什么方法我可以重写,称为onCreateView并提供位置信息吗?一个丑陋的解决方案是在实际片段中设置fab可见性,但是,如果我重新排列第一页和最后一页的位置,这将很脆弱。

您可以使用ViewPager的设置页面更改侦听器

    myViewPager.setOnPageChangeListener(new OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {}
    public void onPageScrolled(int position, float positionOffset, int    positionOffsetPixels) {}

    public void onPageSelected(int position) {
        // Check if this is the page you want.
    }
});

在回答我的第二个问题(你如何处理第一页)时,请参阅下面的建议:

答案是手动调用
onPageSelected
,但必须在设置适配器后进行。我的代码出现:

         // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    ViewPager.SimpleOnPageChangeListener vpsopcl = new ViewPager.SimpleOnPageChangeListener() {
        public void onPageSelected(int position) {
            //Make the floating action button invisible if it doesn't make sense
            fabPrev.setVisibility(position == 0 ? View.INVISIBLE : View.VISIBLE);
            fabNext.setVisibility(position == mMenuItems.length - 1 ? View.INVISIBLE : View.VISIBLE);
        }
    };
    mViewPager.addOnPageChangeListener(vpsopcl);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    //manually call the OnPageSelected to set the buttons on the first page
    vpsopcl.onPageSelected(0);

为什么不在ViewPager中使用OnPageChangeListener?在OPs中,他可以检查
(position==0 | | position==adapter.getItemCount()-1)
听起来很有希望!我会试试看。这很有效(除了下面的但是)。我要注意的是,
setOnPageChangeListener
已被弃用,并被
addOnPageChangeListener
取代,我使用了
onImplePageChangeListener
但当显示第一页时,
onPageSelected
不会触发。我做了一些挖掘,看到了对这个问题的承认,但没有解决办法。有什么想法吗?
         // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    ViewPager.SimpleOnPageChangeListener vpsopcl = new ViewPager.SimpleOnPageChangeListener() {
        public void onPageSelected(int position) {
            //Make the floating action button invisible if it doesn't make sense
            fabPrev.setVisibility(position == 0 ? View.INVISIBLE : View.VISIBLE);
            fabNext.setVisibility(position == mMenuItems.length - 1 ? View.INVISIBLE : View.VISIBLE);
        }
    };
    mViewPager.addOnPageChangeListener(vpsopcl);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    //manually call the OnPageSelected to set the buttons on the first page
    vpsopcl.onPageSelected(0);