FragmentStatePagerAdapter добавить вкладку перед текущей вкладкой без обновления - PullRequest
0 голосов
/ 30 октября 2018

Я знаю, что в SO есть некоторые вопросы по этому поводу, но никто не помог мне.

Это моя ситуация:

  • У меня есть табулатура с N вкладками динамики.
  • Одна из этих вкладок (назовите ее «ДЕЯТЕЛЬНОСТЬ») имеет вид списка с некоторыми истинно-ложными элементами.
  • Изменение значения определенных элементов, добавит или удалит вкладку перед этой текущей вкладкой (назовите ее «ДЕТАЛИ»).

Чтобы объяснить ситуацию:

Исходная ситуация

Вкладки (выделено жирным шрифтом)

ГЛАВНАЯ - ДЕТАЛИ - ЗАКАЗЧИК - ЗАВОД - ДЕЯТЕЛЬНОСТЬ - НЕКОТОРЫЕ

  • На вкладке ДЕЯТЕЛЬНОСТЬ я изменяю проверенное значение этого флажка, и я хочу, чтобы это была новая ситуация:

ДОМ - ЗАКАЗЧИК - ЗАВОД - ДЕЯТЕЛЬНОСТЬ - НЕКОТОРЫЕ

Вот что я получил:

У меня только две оценки:


1: SOMETHINGELSE выбран заголовок вкладки и ACTIVITIES показанное содержимое

2: ДЕЯТЕЛЬНОСТЬ выбран заголовок вкладки и SOMETHINGELSE показ содержимого

Я хочу добавить / удалить этот заголовок, показывающий ACTIVITIES tabn selectedn и ACTIVITIES показанный контент.

После этого длинного вступления вот мой код:

FragmentStatePagerAdapter

private class PagerAdapter extends FragmentStatePagerAdapter {
    private int mNumOfTabs;
    private SparseArray<MyFragmentsInterface> activeFragments;
    private ArrayList<MyHeaderEnum> titles;

    MyFragmentsInterface getNewMeterFragmentIfAvailable(int position) {
        try {
            return activeFragments.get(position);
        } catch (Exception ex) {
            return null;
        }
    }

    PagerAdapter(FragmentManager fm, int NumOfTabs, ArrayList<MyHeaderEnum> titles) {
        super(fm);
        this.activeFragments = new SparseArray<>();
        this.mNumOfTabs = NumOfTabs;
        this.titles = titles;
    }


    @Override
    public int getItemPosition(@NonNull Object object) {
        //I played a lot with this part to manage the addiction-removal of tabs before current, but without succeed
        return super.getItemPosition(object);
    }

    void removetitle(int position) {
        if (position != -1 && position < titles.size()) {
            titles.remove(position);
            mNumOfTabs--;
            notifyDataSetChanged();
        }
    }

    void addTitle(int position, MyHeaderEnum title) {
        titles.add(position, title);
        mNumOfTabs++;
        notifyDataSetChanged();
    }

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

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (openedIntervention.isInPlace()) {
            activeFragments.get(position).save(false);
        }
        activeFragments.remove(position);

        super.destroyItem(container, position, object);
    }

    @Override
    public Fragment getItem(int position) {
        MyHeaderEnum currentTitle = titles.get(position);

        Bundle bundle = new Bundle();
        bundle.putString(_intervention_id_key, interventionID);

        currentFragment = newFragment;

        //this is to retrieve the correct content for the header
        switch (currentTitle) {
            case DETTAGLIO:
                InterventoDettaglioFragment interventoDettaglioFragment = new InterventoDettaglioFragment();
                interventoDettaglioFragment.setArguments(bundle);
                newFragment = interventoDettaglioFragment;
                return interventoDettaglioFragment;
                //... and so on
        }
        return null;
    }

    @NonNull
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        MyFragmentsInterface fragment = (MyFragmentsInterface) super.instantiateItem(container, position);

        activeFragments.put(position, fragment);

        return fragment;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titles.get(position).getValue();
    }
}

Метод (в действии) для добавления / удаления вкладки:

public void manageTabBefore() {
    //pre-code to decide if it has to be added or not

    if (hasToBeAdded) {
        isTabAdded = true;
        adapter.addTitle(podTabIndex, MyHeaderEnum.POD);
    } else if (hasToBeRemoved) {
        isTabAdded = false;
        adapter.removetitle(podTabIndex);
    }
}

TabLayout на выбранной вкладке изменения

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() 
    {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            //I also played a looooot with this
            int position = tab.getPosition();
            viewPager.setCurrentItem(position);
        }

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

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

Я близок к тому, чтобы сдаться, что я могу сделать, чтобы добавить вкладку до без обновления текущей вкладки и без изменения выбранной вкладки ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...