Android 从FragmentPagerAdapter动态添加和删除片段
我有一个用于viewPager的FragmentPagerAdapter,它最初只有一个片段。我想在用户从右向左滑动时向适配器动态添加新片段,并在用户从左向右滑动时动态删除片段。我曾尝试使用此库,但在该库中,我们可以在单击按钮时添加和删除片段。我曾尝试将OnPageChangeListener添加到viewpager,但回调方法(onPageScrolled和onPageScrollStateChanged)被多次调用,这导致FragmentPagerAdapter中添加了多个片段。因此,请阐明如何做到这一点 我想在用户从右向左滑动时向适配器动态添加一个新片段,并在用户从左向右滑动时动态删除一个片段 好的,任何Android 从FragmentPagerAdapter动态添加和删除片段,android,android-viewpager,fragmentpageradapter,commonsware-cwac,Android,Android Viewpager,Fragmentpageradapter,Commonsware Cwac,我有一个用于viewPager的FragmentPagerAdapter,它最初只有一个片段。我想在用户从右向左滑动时向适配器动态添加新片段,并在用户从左向右滑动时动态删除片段。我曾尝试使用此库,但在该库中,我们可以在单击按钮时添加和删除片段。我曾尝试将OnPageChangeListener添加到viewpager,但回调方法(onPageScrolled和onPageScrollStateChanged)被多次调用,这导致FragmentPagerAdapter中添加了多个片段。因此,请阐明
PagerAdadpter
都不支持该选项。ArrayPagerAdapter
肯定不支持它。该页面必须存在,否则无法滑动到该页面。您不能先刷卡,然后再添加页面
此外,我从来没有发现过一个你提出的模式的用例,它不能通过将页面放在适配器中来处理,但在刷卡开始之前不能填充页面(即,无论你似乎试图避免的是什么昂贵的工作)。@dora:我认为在你的情况下,FragmentStatePagerAdapter将帮助你。根据我的理解,我在下面提到了它的用途。我希望它能帮助您做出决定 有两种方法可以实现ViewPager: •碎片状态页雷达 •碎片页雷达 FragmentStatePagerAdapter类消耗更少的内存,因为它会在用户看不到片段时立即销毁片段,只保留该片段的保存状态 碎片PageRadapter:当碎片数量较少时。但是,使用AndroidFragmentPagerAdapter处理大量碎片会导致混乱和滞后 viewPager所保留的页面数? 任何ViewPager将保留的项目数由setOffscreenPageLimit()方法设置。屏幕外页面限制的默认值为3。这意味着ViewPager将跟踪当前可见的页面,一个向左,一个向右。跟踪页面的数量始终以当前可见页面为中心
请按此链接获取代码:我知道这篇文章很旧,但我很难弄明白,所以我还是会回答的 您想使用FragmentStatePagerAdapter并覆盖
getItemPosition()
。创建一个要传递给片段的内容列表,调用notifyDataSetChanged()
,就可以了
下面是适配器:
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
List<String> mKeyList = new ArrayList<>();
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@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).
return PlaceholderFragment.newInstance(mKeyList.get(position));
}
@Override
public int getCount() {
return mKeyList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return "SCOUT " + (getCount() - position);
}
public void add(int position, String key) {
mKeyList.add(position, key);
notifyDataSetChanged();
}
}
:我正在尝试实现一个日历,因此每当用户从右向左滑动时,他都会转到下周。但在查看页面顶部还有一个按钮,允许用户切换月份。因此,想象一下这种情况,假设用户首先使用月份切换器buton转到下个月(在切换月份butonclick中,我写入viewpager.setCurrentItem)(currentposition+1)),然后决定滑动viewpager以转到前一周。用户将无法返回到开始的日期,因为在后台只有一个帧。我的需要:他应该返回到他开始的位置started@dora: “我正在尝试实现一个日历,因此每当用户从右向左滑动时,他都会转到下一周"--
ViewPager
不太适合这个角色,因为未来有无限多个星期,过去也有很多个星期。我不需要导航到过去。我只需要导航到当前时间和未来。如果有办法,请帮助我it@dora:同样,我不会使用ViewPager
,而是would可以用手势滚动其他东西。哦,上帝..谢谢,伙计,在2天后找到了这个解决方案。工作很棒。非常感谢。通过扩展FragmentStatePagerAdapter而不是FragmentPageRadapter来实现添加现在很容易,删除的情况在哪里?确实如此,我已经继续了。我现在使用一个支持移动项目的工具。如果你调用notifyDataSetChanged()
,它只会根据需要添加或删除片段。这意味着每个片段都必须自行管理更新,因为notify不会刷新片段。如果您使用Firebase或Room之类的工具,就可以了。
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SCOUT_KEY = "scout_key";
public static PlaceholderFragment newInstance(String key) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putString(ARG_SCOUT_KEY, key);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.current_scout_fragment, container, false);
//getArguments().getString(ARG_SCOUT_KEY));
return rootView;
}
}