Динамически создавать вкладки в Tablayout из неработающего списка - PullRequest
0 голосов
/ 05 августа 2020

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

Вот код класса MainAcitivity для ящика, который я используйте:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private DataViewModel dataViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if(SharedPrefernces.getUseNightMode()) {
            setTheme(R.style.AppThemeDark);
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        navigationView = findViewById(R.id.nav_view);
        addNavigationMenuItem(navigationView);
        navigationView.setNavigationItemSelectedListener(this);
       
        // Get a new or existing ViewModel from the ViewModelProvider.
        dataViewModel = ViewModelProviders.of(this).get(DataViewModel.class);
    }

  private void addNavigationMenuItem (NavigationView navView) { 
    Menu menu = navView.getMenu();
      SubMenu subMenu = menu.addSubMenu(getString(R.string.my_interests));
        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));
            int count = 1;
            for (String interest:my_interests) {
                boolean checked = SharedPrefernces.getActiveInterest().equalsIgnoreCase(interest);
                subMenu.add(0, Menu.FIRST + count++, Menu.FIRST, interest).setIcon(getDrawable(R.drawable.ic_news_drawer)).setCheckable(true).setChecked(checked);
            }
        }
    }


    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        unCheckAllMenuItems(navigationView.getMenu());
        //item.setChecked(true);
        String title = item.getTitle().toString();
        if(!SharedPrefernces.getActiveInterest().equalsIgnoreCase(title)) {
            SharedPrefernces.setActiveInterest(title);

            //clear feeds and send flag to reload feeds fragment
            dataViewModel.deleteAllArticles();
            SharedPrefernces.setReloadArticles(true);

            LocalMessageManager.getInstance().send(R.id.reload_feeds);
        }

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

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

TabsFragment :

public class HomeTabsFragment extends Fragment {

    private View view;

    TabLayout mTabLayout;
    ViewPager mViewPager;
    Adapter mPagerAdapter;
    List<String> tabItems = new ArrayList<>();
    private DataViewModel dataViewModel;

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

        dataViewModel = ViewModelProviders.of(this).get(DataViewModel.class);

        mViewPager = (ViewPager) view.findViewById(R.id.home_list_tabs_container);
        mTabLayout = (TabLayout) view.findViewById(R.id.home_list_tabs);

        mPagerAdapter = new Adapter(getFragmentManager());
        mViewPager.setAdapter(mPagerAdapter);
        mTabLayout.setupWithViewPager(mViewPager);

        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));
            int count = 1;
            for (String interest : my_interests) {
                addTab(interest + count++);

                if(!SharedPrefernces.getActiveInterest().equalsIgnoreCase(interest)) {
                    SharedPrefernces.setActiveInterest(interest);

                    //clear feeds and send flag to reload feeds fragment
                    dataViewModel.deleteAllArticles();
                    SharedPrefernces.setReloadArticles(true);

                    LocalMessageManager.getInstance().send(R.id.reload_feeds);
                }
            }
            
        }


        return view;
    }

    private void addTab(String title) {
        mTabLayout.addTab(mTabLayout.newTab().setText(title));
        addTabPage(title);
    }

    public void addTabPage(String title) {
        tabItems.add(title);
        mPagerAdapter.notifyDataSetChanged();
    }


    @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;
    }

    class Adapter extends FragmentPagerAdapter {

        public Adapter(FragmentManager fm) {
            super(fm);
        }

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

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

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


}

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

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