如何以编程方式在ViewPager中设置选项卡及其相应标签的数量?

时间:2018-07-22 17:29:05

标签: android android-activity android-viewpager fragment spinner

好的。我有一个Spinner,它具有从数据库检索的一组值。此微调器位于Fragment内,该Fragment是使用ViewPager的Tabbed Activity的一部分。这就是我要达到的目标:

  1. 旋转器具有一定的价值
  2. 根据此值,从Spinner的onChanged()(或类似方法)方法传递的信息中,ViewPager的选项卡数(及其相应的标签)发生变化

我将从何处开始执行此操作?我完全不知道从哪里开始。

1 个答案:

答案 0 :(得分:1)

我在onResume中使用以下代码根据用户选择的配置(在本例中在另一活动中指定)更改选项卡和页面的数量。当用户从微调器中选择配置时,您可以调用类似的内容。

ConfigurationEnum ct = getSelectedConfiguration(); // or pass in from spinner

if( ct != mPagerAdapter.getConfiguration() ) {

    // remove all tabs
    int cnp = mPagerAdapter.getCount();
    while( cnp > 0 ) {
        mPagerAdapter.destroyItem(mViewPager, cnp - 1, mPagerAdapter.getItem(cnp - 1));
        mTabLayout.removeTabAt(cnp-1);
        --cnp;
    }

    // now add back tabs we need
    ArrayList<String> tabList = ct.getTabsToShow();

    for(int i = 0; i < meas.size(); ++i) {
        mTabLayout.addTab(mTabLayout.newTab().setText(tabList.get(i)),i);
    }

    mTabLayout.invalidate();
    mPagerAdapter.setConfiguration(ct);
    mPagerAdapter.notifyDataSetChanged();
}

我的自定义寻呼机适配器设置为根据此处设置的配置知道要显示哪些片段。

static class MyPagerAdapter extends FragmentPagerAdapter {

    private ConfigurationEnum myConfiguration = ConfigurationEnum.DEFAULT;
    private int numPages = 3;

    void setConfiguration(ConfigurationEnum ct) {
        myConfiguration = ct;
        numPages = ct.getTabsToShow().size();
    }

    ConfigurationEnum getConfiguration() {
        return myConfiguration;
    }

    MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch(myConfiguration) {
            case CONFIG_A:
                switch(position) {
                    case 0:
                        return FragmentA1.getInstance();
                    case 1:
                        return FragmentA2.getInstance();
                }
                break;
            case CONFIG_B:
                switch(position) {
                    case 0:
                        return FragmentB1.getInstance();
                    case 1:
                        return FragmentB2.getInstance();
                    case 2:
                        return FragmentB3.getInstance();
                    case 3:
                        return FragmentB4.getInstance();
                }
                break;
            case CONFIG_C:
                switch(position) {
                    case 0:
                        return FragmentC1.getInstance();
                    case 1:
                        return FragmentC2.getInstance();
                    case 2:
                        return FragmentC3.getInstance();
                }
                break;
        }
    }

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

    @Override
    public int getItemPosition(@NonNull Object obj) {
        return POSITION_NONE;
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        mCurrentFragment = ((Fragment) object);
        super.setPrimaryItem(container, position, object);
    }
}

以及ConfigurationEnum

的示例实现
public enum ConfigurationEnum {
    CONFIG_A,
    CONFIG_B,
    CONFIG_C;

    ArrayList<String> getTabsToShow() {
        ArrayList<String> tabs = new ArrayList<>();

        switch(this) {
            case CONFIG_A:
                tabs.add("Tab A1");
                tabs.add("Tab A2");
                break;
            case CONFIG_B:
                tabs.add("Tab B1");
                tabs.add("Tab B2");
                tabs.add("Tab B3");
                tabs.add("Tab B4");
                break;
            case CONFIG_C:
                tabs.add("Tab C1");
                tabs.add("Tab C2");
                tabs.add("Tab C3");
                break;
        }

        return tabs;
    }
}