Динамически создавать вкладки в Tablayout из списка? - PullRequest
0 голосов
/ 04 августа 2020

Мое приложение создает подменю ящика из значений общих предпочтений. Эти подменю в основном называются «интересами» или категориями. Я пытаюсь перенести ту же функциональность в tablayout, так как это намного удобнее, но не получается заставить его работать!

Изменить : Новый код на основе предложений.

TabsFragment :

public class HomeTabsFragment extends Fragment implements ViewPager.OnPageChangeListener {

    private View view;
    private SectionsPagerAdapterHome homePageAdapter;
    public ViewPager viewPager;

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

        TabLayout tabLayout = view.findViewById(R.id.home_list_tabs);
        viewPager = view.findViewById(R.id.home_list_tabs_container);

        homePageAdapter = new SectionsPagerAdapterHome(getFragmentManager());
        viewPager.setAdapter(homePageAdapter);
        viewPager.setOffscreenPageLimit(tabLayout.getTabCount());
        viewPager.addOnPageChangeListener(this);
        tabLayout.setupWithViewPager(viewPager);

        if(SharedPrefernces.getUserInterests()!=null) {
            List<String> my_interests = SharedPrefernces.getUserInterests();
            Collections.sort(my_interests, String::compareToIgnoreCase);
            my_interests.add(0, getString(R.string.all_stories));
            for (String interest : my_interests) {
                homePageAdapter.addTabPage(new FeedsFragment(), interest);
            }

        }

        return view;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Do something that differs the Activity's menu here
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return false;
    }


    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {

        Fragment fragment = homePageAdapter.getFragment(position);
        if (fragment != null) {
            fragment.onResume();
        }

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}

Адаптер :

public class SectionsPagerAdapterHome extends FragmentPagerAdapter {

    private FragmentManager fragmentManager;
    private ArrayList fragmentTags = new ArrayList();
    private ArrayList<String> titles = new ArrayList();

    protected SectionsPagerAdapterHome(FragmentManager fm) {
        super(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        fragmentManager = fm;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object object = super.instantiateItem(container, position);
        if (object instanceof Fragment) {
            Fragment fragment = (Fragment) object;
            String tag = fragment.getTag();
            fragmentTags.add(position, tag);
        }
        return object;
    }

    public Fragment getFragment(int position) {
        Fragment fragment = null;
        Object tag = fragmentTags.get(position);
        if (tag != null) {
            fragment = fragmentManager.findFragmentByTag(String.valueOf(tag));
        }
        return fragment;
    }

    @Override
    public Fragment getItem(int position) {
        return FeedsFragment.newInstance();
    }

    public void addTabPage(Fragment fragment,String title) {
        titles.add(title);
        fragmentTags.add(fragment);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return fragmentTags.size();
    }

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

Я не знаю, как мне этого добиться, поэтому нужна помощь.

1 Ответ

1 голос
/ 04 августа 2020

Поскольку вы используете ViewPager с Adapter вместо использования tabLayout.addTab(...), вам необходимо добавить элемент в адаптер. Что-то вроде:

public class SectionsPagerAdapterHome extends FragmentPagerAdapter {
   

   private ArrayList fragmentTags = new ArrayList();
   private ArrayList<String> titles = new ArrayList();
   
   //.....
        
   public void addTabPage(Fragment fragment,String title) {
          titles.add(title);
          fragmentTags.add(fragment);
          notifyDataSetChanged();
   }

    @Override
    public int getCount() {
        return fragmentTags.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return tables.get(position);
    }
        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...