Я знаю, что в 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) {
}
});
Я близок к тому, чтобы сдаться, что я могу сделать, чтобы добавить вкладку до без обновления текущей вкладки и без изменения выбранной вкладки ?