【问题标题】:Hide tab in FragmentPagerAdapter在 FragmentPagerAdapter 中隐藏选项卡
【发布时间】:2015-04-21 09:29:36
【问题描述】:

我需要在特定条件下隐藏第二个选项卡,我尝试了以下方式,选项卡隐藏,文本也改变了,但片段没有改变,我的意思是,如果我隐藏了第二个选项卡,那么我得到 @ 987654321@[第二个标签的内容] 在第三个标签上,

public class PagerAdapter extends FragmentPagerAdapter {

    private static final String TAG = "PagerAdapter";
    private final String[] TITLES_WITH_STEP2 = {"step1", "step2", "step3", "step4"};
    private final String[] TITLES_WITHOUT_STEP2 = {"step1", "step3", "step4"};
    private ArrayList<Fragment> fragmentsList;

    private boolean isShowStep2Tab = true;

    public PagerAdapter(FragmentManager fm) {
        super(fm);
        fragmentsList = new ArrayList<>();
        fragmentsList.add(new FragmentStep1());
        fragmentsList.add(new FragmentStep2());
        fragmentsList.add(new FragmentStep3());
        fragmentsList.add(new FragmentStep4());
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Log.v(TAG, "getPageTitle isShowStep2Tab : " + isShowStep2Tab);
        fragmentsList = new ArrayList<>();
        return isShowStep2Tab ? TITLES_WITH_STEP2[position] : TITLES_WITHOUT_STEP2[position];
    }

    @Override
    public Fragment getItem(int position) {
        /*Log.v(TAG, "getItem isShowStep2Tab : " + isShowStep2Tab);
        if (getPageTitle(position).equals("Step1")) {
            return new FragmentStep1();
        } else if (getPageTitle(position).equals("Step2")) {
            return new FragmentStep2();
        } else if (getPageTitle(position).equals("Step3")) {
            return new FragmentStep3();
        } else if (getPageTitle(position).equals("Step4")) {
            return new FragmentStep4();
        }else {
            return new FragmentStep4();
        }*/
        return fragmentsList.get(position);
    }

    @Override
    public int getCount() {
        Log.v(TAG, "getCount isShowStep2Tab : " + isShowStep2Tab);
        fragmentsList = new ArrayList<>();
        return isShowStep2Tab ? TITLES_WITH_STEP2.length : TITLES_WITHOUT_STEP2.length;
    }

    public void setShowFamilyTab(boolean isShowStep2Tab) {
        this.isShowStep2Tab = isShowStep2Tab;
        fragmentsList = new ArrayList<>();
        if (isShowStep2Tab) {
            fragmentsList.add(new FragmentStep1());
            fragmentsList.add(new FragmentStep2());
            fragmentsList.add(new FragmentStep3());
            fragmentsList.add(new FragmentStep4());
        } else {
            fragmentsList.add(new FragmentStep1());
            fragmentsList.add(new FragmentStep3());
            fragmentsList.add(new FragmentStep4());
        }
        notifyDataSetChanged();
    }
}

我不知道这里有什么问题。

【问题讨论】:

  • 投反对票的原因...

标签: android pagerslidingtabstrip


【解决方案1】:

我建议你只将位置传递给适配器的getItem 方法。

 @Override
    public Fragment getItem(int i) {
        Fragment fragment = new DemoObjectFragment();
        Bundle args = new Bundle();
        args.putInt(DemoObjectFragment.ARG_OBJECT, i); // Our object is just an integer :-P
        fragment.setArguments(args);
        return fragment;
    }

之后,您可以从对象列表(您的页面)中获取位置并检查条件(显示或不显示)。

在你的DemoObjectFragment

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_collection_object, container, false);
        Bundle args = getArguments();
        FragmentPageToShow tempFragmentPage = fragmentDataList.get(args.getInt(ARG_OBJECT));

在创建片段页面适配器时使用相同的对象列表。

public static class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {

    private Fragment mCurrentFragment;

    public Fragment getCurrentFragment() {
        return mCurrentFragment;
    }

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

    @Override
    public Fragment getItem(int i) {
        Fragment fragment = new DemoObjectFragment();
        Bundle args = new Bundle();
        args.putInt(DemoObjectFragment.ARG_OBJECT, i); // Our object is just an integer :-P
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        // For this contrived example, we have a 100-object collection.
        return fragmentDataList.size();
    }

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

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

    }
}

不要为每个页面创建FragmentStepX 类。只需使用一个 Fragment 并适当地传递数据。

要么创建数据对象的数组列表,最初仅用于“要显示的对象”,要么在数组列表更改时动态刷新适配器。

在设置/刷新适配器之前,您始终可以拥有要显示的项目列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2012-02-26
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多