Я пытаюсь создать тот же view pager + tabs
дизайн, что и PlayStore 5.1.x. Вот мой макет:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_tabs" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Мой адаптер:
public class MainPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<FakeFragment> fragments;
public MainPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
fragments = new ArrayList<FakeFragment>();
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
if(position < getCount()) {
FakeFragment fragment = FakeFragment.newInstance(position);
fragments.add(fragment);
}
return fragments.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Category.values().length;
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return Category.values()[position].getTitle();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
}
Мои вкладки и пейджер отображаются правильно! но я заметил, что первый фрагмент, отображаемый в пейджере просмотра, всегда совпадает со вторым. Затем, когда я прокручиваю один раз, дважды и возвращаюсь к первой странице, я обнаруживаю, что теперь отображается правильный фрагмент !!
Я не могу понять, почему такое поведение, пожалуйста, мне нужны некоторые объяснения.
РЕШЕНИЕ
Проблема возникла из-за моего определения метода FakeFragment.newInstance()
.
private static int position;
public static FakeFragment newInstance(int position) {
// TODO Auto-generated method stub
FakeFragment.position = position;
return new FakeFragment();
}
Я изменил его, используя setArguments(args)
для моего экземпляра FakeFragment
, а затем получил его методом onCreate
. Теперь все работает хорошо!
Может кто-нибудь объяснить мне, почему ??
Я думаю, что таким образом значение позиции будет полностью зависеть от жизненного цикла фрагмента, поэтому всегда будет ожидаемая позиция, верно??
private ArrayList<FakeFragment> fragments
и простоgetItem()
верните новый экземпляр фрагмента. Полная и цельная точка позадиFragmentStatePagerAdapter
состоит в том, чтобы НЕ удерживать все фрагменты в памяти. Если это то, что вы хотите, то все равно избавьтесь отArrayList<FakeFragment>
и переключите адаптер наFragmentPagerAdapter
, а не наFragmentStatePagerAdapter
. Также избавьтесь отgetItemPosition()
. FWIW, вот ряд примеровViewPager
использующих приложений. - person CommonsWare   schedule 01.01.2015FragmentStatePagerAdapter
, потому что у меня есть 6 страниц в моемViewPager
, на каждой странице у меня естьGridView
с большим количеством данных для отображения. Вот почему я хотел использовать этот тип адаптера, чтобы воссоздать страницу или обновить ее содержимое только в случае необходимости. Вот почему я также пытался переопределитьgetItemPosition
. Возможно ли это сFragmentPagerAdapter
? еще раз спасибо за ответ! - person S.Thiongane   schedule 01.01.2015FragmentStatePagerAdapter
, используйтеFragment.onSaveInstanceState
для сохранения загруженного набора данных. - person Eugen Pechanec   schedule 01.01.2015