【问题标题】:It is possible to add/remove tabs in ViewPager at run time?可以在运行时在 ViewPager 中添加/删除选项卡吗?
【发布时间】:2016-07-13 07:12:15
【问题描述】:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.v(TAG, "onCreateView");

    View rootView = inflater.inflate(R.layout.fragment_home, container, false);

    // setting up the view pager and tab layout
    mViewPager = (ViewPager) rootView.findViewById(R.id.view_pager);
    mTabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout);
    PageAdapter adapter = new PageAdapter(getFragmentManager());
    mViewPager.setAdapter(adapter);

    mTabLayout.setupWithViewPager(mViewPager);
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));

    return rootView;
}

我的自定义寻呼机适配器如下所示:

public class PageAdapter extends FragmentStatePagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        return new GroupTabFragment(position);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        String title = "";
        switch (position) {
            case 0:
                title = "Game";    // this is from a template, i have to
                break;             // return title dynamically
            case 1:
                title = "Movie";
                break;
        }
        return title;
    }

    @Override
    public int getCount() {
        return 2;                  // the tabs number is a subject of change
    }                              // i don't know it from the begining
}

我遇到的问题是,当单击按钮或类似的东西时,我必须添加或删除选项卡。

每个选项卡都会显示一个经典的对象列表。 谢谢。

【问题讨论】:

    标签: java android android-fragments android-viewpager android-tablayout


    【解决方案1】:

    虽然ViewPager 不适合动态删除,但有两种方法:

    1) 将ArrayList<Fragment> data 作为参数传递给PageAdapter

    然后适配器将如下所示:

    public class PageAdapter extends FragmentStatePagerAdapter {
    private ArrayList<Fragment> data;
    
    public PageAdapter(FragmentManager fm, ArrayList<Fragment> data) {
        super(fm);
        this.data = data;
    }
    
    @Override
    public Fragment getItem(int position) {
        return data.get(position);
    }
    
    @Override
    public CharSequence getPageTitle(int position) {
        String title = "";
        switch (position) {
            case 0:
                title = "Game";    // this is from a template, i have to
                break;             // return title dynamically
            case 1:
                title = "Movie";
                break;
        }
        return title;
    }
    
    @Override
    public int getCount() {
        return data.size();                  // the tabs number is a subject of change
    }                              // i don't know it from the begining
    

    }

    删除您在 Activity\Fragment 中执行的项目:

    data.remove(fragmentId);
    adapter.notifyDataSetChanged();
    

    2) 每次要删除项目时重新创建适配器。因此,您基本上可以使用新数据创建新适配器。

    data.remove(fragmentId);
    PageAdapter adapter = new PageAdapter(getFragmentManager(), data);
    mViewPager.setAdapter(adapter);
    

    【讨论】:

    • 是否有可能在某些按钮单击时添加另一个选项卡?
    • 跳。 data.add(new YourFragment()); adapter.notifyDataSetChanged();
    【解决方案2】:

    您可以手动设置标签,而不是使用mTabLayout.setupWithViewPager(mViewPager);

    mTabLayout.addTab(mTabLayout.newTab().setText("Movie"));
    mTabLayout.addTab(mTabLayout.newTab().setText("Game"));
    mTabLayout.addTab(mTabLayout.newTab().setText("Audio"));
    mTabLayout.setOnTabSelectedListener(this);
    

    删除也很简单:removeTabAt(int position)removeTab(Tab tab)

    【讨论】:

    • 是的,这行得通。但是当我从另一个函数调用它时,java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.design.widget.TabLayout$Tab android.support.design.widget.TabLayout.newTab()' on a null对象引用
    • 是否有可能在某些按钮单击时添加其他选项卡?
    【解决方案3】:

    在这里,我找到了一些更好的解决方案,可以从当前上下文中删除所有视图/片段。

    这里我在 Fragment 中使用了 TabLayout 和 ViewPage。 所以我们需要清除 TabLayout 中的选项卡、ViewPage 中的视图和 FragmentManager 中的片段。

        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();
    
        FragmentManager fragmentManager = null;
        public TabLayout tabLayout;
        public ViewPager viewPager;
    
        public ViewPagerAdapter(FragmentManager manager, TabLayout tabLayout, ViewPager pager) {
            super(manager);
            this.fragmentManager= manager;
            this.tabLayout = tabLayout;
            this.viewPager= pager;
        }
    
        public void removeAll() {
            tabLayout.removeAllTabs();
            viewPager.removeAllViewsInLayout();
            viewPager.removeAllViews();
            viewPager.setAdapter(null);
    
            fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
            if (manager.getFragments() != null) {
                manager.getFragments().clear();
            }
            viewPager.setAdapter(adapterPage);
            viewPager.invalidate();
            viewPager.requestLayout();
    
            mFragmentList.clear();
            mFragmentTitleList.clear();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多