Фрагменты TabLayout создаются одинаково, когда отладчик не подключен

У меня есть TabLayout, который использует пользовательский адаптер (TabPagerAdapter.java), он инициализируется с помощью этой функции (у меня ранее была проблема, что вещи не обновлялись при замене, поэтому он удаляет все перед инициализацией):

public boolean setPagerViewContents(int mode, ArrayList<String> titles) {
    try {
        mTabLayout.removeAllTabs();
        mViewPager.setAdapter(null);
        mViewPager.removeAllViews();
        for (int i = 0; i < titles.size(); i++) {
            mTabLayout.addTab(mTabLayout.newTab().setText(titles.get(i)));
        }

        mAdapter = new TabPagerAdapter(getSupportFragmentManager(), titles.size(), mode);
        mViewPager.setAdapter(mAdapter);
        mViewPager.invalidate();
        return true;
    } catch (Exception e) {
        mErrorReporter.reportError(e);
        return false;
    }
}

Пользовательский адаптер (TabPageAdapter.java):

public class TabPagerAdapter extends FragmentStatePagerAdapter {

    int mTabCount;
    int mLayoutType;

    public TabPagerAdapter(FragmentManager fm, int numberOfTabs, int layoutType) {
        super(fm);
        this.mTabCount = numberOfTabs;
        this.mLayoutType = layoutType;
    }

    @Override
    public Fragment getItem(int position) {
        switch (mLayoutType) {
            case 0:
                switch (position) {
                    case 0:
                        return new Fragment15();
                    case 1:
                        return new Fragment1();
                    default:
                        return null;
                }
            case 1:
                switch (position) {
                    case 0:
                        return new Fragment3();
                    case 1:
                        return new Fragment2();
                    default:
                        return null;
                }
            default:
                return null;
        }
    }

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

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

Когда приложение запускает функцию setPagerViewContents (с правильным режимом и названиями) вызывается, после этого mViewPager.setCurrentItem(number) вызывается для отображения правой вкладки. Но теперь фрагмент, отображаемый в mViewPager, корректен, но при нажатии на заголовок вкладки фрагмент при запуске отображается так же, как и с индексом. number, а не тот, который должен был отображаться), при нажатии на первую (number) снова и снова на другую вкладку (не number) показанная вкладка верна.

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

1 ответ

Решение

Измените следующий метод:

public boolean setPagerViewContents(int mode, ArrayList<String> titles) {
        try {
            mAdapter = new TabPagerAdapter(getSupportFragmentManager(), titles.size(), mode);
            mViewPager.setAdapter(mAdapter);
            mTabLayout.setupWithViewPager(mViewPager);
            return true;
        } catch (Exception e) {
            mErrorReporter.reportError(e);
            return false;
        }
    }

и установите текст на вкладках в TabPagerAdapter, переопределив следующий метод:

@Override
    public CharSequence getPageTitle(int position) {
        return context.getString(tabTitles[position]);
    }
Другие вопросы по тегам