Использование ViewPager.OnPageChangeListener
- правильный путь, но вам нужно будет немного реорганизовать ваш адаптер, чтобы сохранить ссылку на каждый фрагмент, содержащийся в FragmentPagerAdapter.
Вы используете это, используя [#]
class PagerAdapter extends FragmentPagerAdapter {
String tabTitles[] = new String[] { "One", "Two", "Three", "Four"};
Context context;
//This will contain your Fragment references:
public Fragment[] fragments = new Fragment[tabTitles.length];
public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public int getCount() {
return tabTitles.length;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
case 2:
return new FragmentThree();
case 3:
return new FragmentFour();
}
return null;
}
//This populates your Fragment reference array:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
fragments[position] = createdFragment;
return createdFragment;
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
}
Затем вместо создания нового фрагмента используйте тот, который содержится в адаптере:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
// do this instead, assuming your adapter reference
// is named mAdapter:
Fragment frag = mAdapter.fragments[position];
if (frag != null && frag instanceof FragmentTwo) {
((FragmentTwo)frag).sendGetRequest();
}
}
@Override
public void onPageScrollStateChanged(int state) { }
});
Обратите внимание: если вы используете разные классы фрагментов в своем адаптере, вы можете реализовать интерфейс, который определяет sendGetRequest()
, а в каждом из ваших классов фрагментов реализует метод sendGetRequest ().
Если вы не идете с интерфейсом, вам нужно будет отбросить фрагмент к вашему собственному типу фрагмента, как показано в примере выше, то есть:
if (frag instanceof FragmentTwo) {
((FragmentTwo)frag).sendGetRequest();
}
Это - лучшая практика никогда для использования бросков C-стиля по трем главным причинам:
, Поскольку palm3D отметил:
я нахожу синтаксис броска в стиле С++ слишком подробным.
Это является намеренным по причинам, приведенным выше.
синтаксис конструктора (официальное название: бросок функционального стиля), семантически тот же как бросок C-стиля и должен избежаться также (за исключением переменных инициализаций на объявлении), по тем же причинам. Это спорно, должно ли это быть верно даже для типов, которые определяют пользовательских конструкторов, но в Эффективном C++, Meyers утверждает, что даже в тех случаях необходимо воздержаться от использования их. Проиллюстрировать:
void f(auto_ptr<int> x);
f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5)); // BAD
static_cast
здесь будет на самом деле звонить auto_ptr
конструктор.
Согласно Stroustrup:
"модернизированные броски" были представлены, чтобы дать программистам шанс указать их намерения более ясно и для компилятора для фиксации большего количества ошибок.
Поэтому действительно, для безопасности, поскольку это делает дополнительное время компиляции, проверяя.
Относительно этого предмета я следую рекомендациям, предоставленным Scott Meyers ( Более эффективный C++ , Объект 2: Предпочтите броски в стиле С++).
я соглашаюсь, что бросок стиля C++ является подробным, но это - то, что мне нравятся приблизительно они: их очень легко определить, и они делают код легче читать (который более важен, чем запись).
Они также вынуждают Вас думать о том, в каком брошенный Вы нуждаетесь, и к выбрал правильный, снизив риск ошибок. Они также помогут Вам обнаруживающий ошибки во время компиляции вместо этого во времени выполнения.
Я использую static_cast по двум причинам.
Определенно в стиле С++. Дополнительный ввод поможет препятствовать тому, чтобы Вы бросили, когда Вы не были должны:-)
C-стиль бросил синтаксис, не делайте проверки на ошибки. Синтаксис броска в стиле С++, делает некоторую проверку. При использовании static_cast, даже если это не делает проверки, по крайней мере, Вы знаете, что необходимо быть осторожными здесь.
Бросок C-стиля является худшим способом пойти. Более трудно видеть, ungreppable, соединяет различные действия, которые не должны соединяться и не могут сделать всего, что могут сделать броски в стиле С++. Они действительно должны были удалить броски C-стиля из языка.
Мы в настоящее время используем броски C-стиля везде. Я спросил другой вопрос о кастинге , и я теперь вижу преимущество использования static_cast вместо этого, если ни по какой другой причине, чем он "greppable" (мне нравится этот термин). Я, вероятно, начну использовать это.
мне не нравится стиль C++; это смотрит совсем как вызов функции.