如何在ViewPager中动态更改片段?

3
我已经创建了6个片段。第1到第3个片段将在早上加载到viewPager中,其他三个片段将在晚上时间加载。如何根据时间动态更新viewPager以显示所需的片段集?这是我的MainActivity代码。我已经在viewPager中实现了前3个片段。但是如何将另外3个片段加载到viewPager中?

MainActivity:

mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        // adding bottom dots
        addBottomDots(0);

        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                MyFragmentInterface fragmentInterface = (MyFragmentInterface) mSectionsPagerAdapter.instantiateItem(mViewPager, position);
                if (fragmentInterface != null) {
                    fragmentInterface.fragmentBecomeVisible();
                    Log.e("PageSelected", position + "");
                }
                addBottomDots(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    private class SectionsPagerAdapter extends FragmentStatePagerAdapter {

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

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
            switch (position) {
                case 0: {
                    return new Fragment1();
                }
                case 1: {
                    return new Fragment2();
                }
                case 2: {
                    return new Fragment3();
                }
            }

            return null;

        }

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

        @Override
        public int getCount() {
            // Show 3 total pages.
            return totalTabs;
        }
    }

如何在晚间加载其他三个片段?

更新: 在寻找解决方案时,我认为会出现一个问题。如果用户从早上开始使用应用程序,那么片段是否会在实时的12:05 PM更新?

4个回答

3

如果接下来的连续数字是晚上的片段,您可以这样做。

switch (position) {
            case 0: {
                if (time != Calendar.AM){
                    return new Fragment4();
                }
                else {
                    return new Fragment1();
                }
            }
            case 1: {
                if (time != Calendar.AM){
                    return new Fragment5();
                }
                else {
                    return new Fragment2();
                }
            }
            case 2: {
                if (time != Calendar.AM){
                    return new Fragment3();
                }
                else {
                    return new Fragment6();
                }
            }
        }

这个看起来更整洁。但是如果用户从早上开始使用应用程序,到了12:01pm会发生什么?片段会实时更改吗? - Sagar Suri
@SagarSuri 不会的。你需要一个线程,如果是PM,它实际上会大幅改变视图。 - Coozgan
如果你在switch里面得到时间,那么当用户更改页面时它会检测并反映出来。或者如果用户停留在同一页上,则使用闹钟管理器,在接收器中尝试退出应用程序或重新加载片段。 - Nitin Patel
你能提供更多细节吗?我对如何使用广播接收器重新加载片段感到困惑。 - Sagar Suri
@SagarSuri 你可能想阅读文档 https://developer.android.com/reference/android/content/BroadcastReceiver.html 或者如果你想要一些代码来跟进,可以看看这个网址 http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html。 - Coozgan

2

更新你的代码

switch (position) {
case 0: {
  if(condition){
    return new FragmentOther1();
  }
  return new Fragment1();
}
case 1: {
  if(condition){
    return new FragmentOther2();
  }
  return new Fragment2();
}
case 2: {
 if(condition){
   return new FragmentOther3();
 }
  return new Fragment3();
}

将您的晚间状态作为时间段进行计算。

实时添加接收器。

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (action.equals(Intent.Intent.ACTION_TIME_TICK)){
            //notify adapter data from here. and also check time logic. this method will call for every minute.
        }
    }
};

在 onCreate 方法中
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.Intent.ACTION_TIME_TICK);
registerReceiver(receiver, filter);

并在onDestory方法中

 if (receiver != null) {
  unregisterReceiver(receiver);
  receiver = null;
}

我也有同感。那会是高效的解决方案吗? - Sagar Suri
这个看起来更整洁。但是如果用户从早上开始使用应用程序,到了12:01pm会发生什么?片段会实时更改吗? - Sagar Suri
实时实现 BroadcastReceiver 以 Intent.ACTION_TIME_CHANGED 和 adapter 的 notifyDataSetChanged。 - Vijay Pal Vishwakarma
这个很棒,我对你的答案有了一个好主意。非常感谢!! - Sagar Suri

1
添加动态片段计数设置。
@Override
public int getCount() {

    // check calendar session.
    if(morning == true) {
    // Show 3 total pages morning.
        return 3;
    }else{
    // Show 3 + 3  6 total pages evening.
        return 6;
    }
}

然后添加片段。
@Override
public Fragment getItem(int position) {
    // getItem is called to instantiate the fragment for the given page.
    // Return a PlaceholderFragment (defined as a static inner class below).
    switch (position) {
        case 0: {
        return new Fragment1 ();
    }
        case 1: {
        return new Fragment2 ();
    }
        case 2: {
        return new Fragment3 ();
    }
        case 3: {
        return new Fragment4 ();
    }
        case 4: {
        return new Fragment5 ();
    }
        case 5: {
        return new Fragment6 ();
    }
    }

    return null;

}

1

为什么你要把它弄得这么复杂?创建两个列表:一个白天的列表和一个晚上的列表。检查时间并根据你的条件使用setAdapternotifyDataSetChanged()

private class SectionsPagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragmentList;

    public SectionsPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList = fragmentList;
    }

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

    public void setFragmentList(List<Fragment> fragmentList) {
        this.fragmentList = fragmentList;
        notifyDataSetChanged();
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

    @Override
    public int getCount() {
        // Show 3 total pages.
        return fragmentList.size();
    }
}

这是如何实现它的。
    List<Fragment> mDayFragments = new ArrayList<>();
    mDayFragments.add(Fragment1);
    mDayFragments.add(Fragment2);
    mDayFragments.add(Fragment3);

    List<Fragment> mNightFragments = new ArrayList<>();
    mNightFragments.add(Fragment4);
    mNightFragments.add(Fragment5);
    mNightFragments.add(Fragment6);

    SectionsPagerAdapter mAdapter;

    if (yourCondition) {
        mAdapter = new SectionsPagerAdapter(mDayAdapter);
    } else {
        mAdapter = new SectionsPagerAdapter(mNightAdapter);
    }

    yourViewPager.setAdapter(mAdapter);

    // Time moving... The night comes...
    mDayAdapter.setFragmentList(mNightFragments);

mDayAdapter.setFragmentList(mNightFragments); 这行代码我不理解。 - Sagar Suri
我在 SectionPagerAdapter 中创建了一个名为 setFragmentList 的函数,用于分配新值给 List<Fragment> 并通知适配器重新更新 ViewPager 中的视图。@SagarSuri - phatnhse
很棒的回答,兄弟。但出于某些原因,我认为广播接收器运行良好。 - Sagar Suri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接