Java 如何检测FragmentPagerAdapter显示的第一页或最后一页?
我有一个非常简单的设置配套应用程序(适用于可穿戴的手表),它使用大约8个滑动页面来设置单选按钮的一些选项。我使用根据所选选项实例化的各个片段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
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);