Третья вкладка получает значения, данные для второй вкладки

Я застрял с этой проблемой на некоторое время. Я делаю приложение, которое имеет три практически идентичных фрагмента. Я использовал этот урок. Я также попытался передать данные из MainActivity во все фрагменты (фрагментами являются restaurantFragment, favouriteRestaurants, blockRestaurants), и только третий является проблематичным. Также, когда я изменяю, какие данные отправляются, на какую вкладку - первая и вторая вкладки получают правильные. Третья вкладка часто вообще не вызывается, и если она вызывается, она в основном получает неверные данные, в отличие от двух других вкладок, а также не отображается ошибка, когда я выбираю третью вкладку, и много раз, когда я пытаюсь оценивать количество вкладок при отладке часто получает только 2 вкладки. Я пробовал это, это и кучу других решений, но ни одно из них не помогло мне.

Иногда, если я выбираю третью вкладку перед второй, она отображает правильный список, но если я выбираю вторую первую, она просто копирует ее вместо отображения правильных значений.

Основная деятельность:

TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_three)));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);

final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
final PagerAdapter adapter = new PagerAdapter
            (getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

PagerAdapter:

public class PagerAdapter extends FragmentStatePagerAdapter {
int mNumOfTabs;

public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
}

@Override    
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            return MapsFragment.newInstance(restaurants);
        case 1:
            return RestaurantsFragment.newInstance(restaurants);
        case 2:
            return MyRestaurantsFragment.newInstance(restaurants);
        default:
            return null;
    }
}

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

Каждый фрагмент выглядит одинаково, вот так:

    public static MyRestaurantsFragment newInstance(ArrayList<Restaurant> restaurants) {

    Bundle args = new Bundle();
    args.putSerializable("restaurants",restaurants);

    MyRestaurantsFragment fragment = new MyRestaurantsFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    restaurantList = (ArrayList<Restaurant>)getArguments().getSerializable("restaurants");
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater,
                     ViewGroup container,
                     Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_my_restaurants, container, false);

    listView = (ListView) view.findViewById(R.id.restaurants_list);
    adapter = new RestaurantsListAdapter(getActivity(), restaurantList);
    listView.setAdapter(adapter);

    return view;
}

content_main:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

    <android.support.design.widget.TabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="scrollable" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:background="@android:color/white" />
</android.support.design.widget.AppBarLayout>

2 ответа

Решение

Ты звонишь setUpWithViewPager(...)?

// Give the TabLayout the ViewPager
TabLayout tabLayout = (TabLayout) root.findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);

Обновить

Чтобы увидеть заголовки, попробуйте переопределить getPageTitle() внутри вашего PagerAdapter, как это:

@Override
public CharSequence getPageTitle(int position) {
    if ( position == 0 ) {
        return "Title 1";
    } else if ( position == 1 ) {
        return "Title 2";
    } else {
        return "Title 3";
    }
}

Кроме того, если вы используете tabLayout.setupWithViewPagerВы можете удалить эти части вашего кода:

tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_three)));

А также

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

Я предполагаю, что ваш макет выглядит примерно так:

<android.support.v4.view.ViewPager
     android:layout_width="match_parent"
     android:layout_height="match_parent">

     <android.support.design.widget.TabLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="top" />

 </android.support.v4.view.ViewPager>

Обновление 2

Попробуйте изменить свой getItem метод таким образом:

@Override
public Fragment getItem(int position) {

    if ( position == 0 ) {
        return MapsFragment.newInstance(restaurants);
    } else if ( position == 1 ) {
        return RestaurantsFragment.newInstance(restaurants);
    }

    return MyRestaurantsFragment.newInstance(restaurants);
}

Вы должны передать данные адаптеру и позвонить

 MyRestaurantsFragment tab3 = MyRestaurantsFragment.newInstance(restaurants);

вместо

MyRestaurantsFragment tab3 = new MyRestaurantsFragment();
Другие вопросы по тегам