我有一个用于viewPager的FragmentPagerAdapter,它最初只有一个Fragment。我想在用户从右向左滑动时动态地将新片段添加到适配器,并在用户从左向右滑动时动态删除片段。我尝试使用此库https://github.com/commonsguy/cwac-pager但在该库中我们有按钮点击添加和删除片段的选项。我试图将一个OnPageChangeListener添加到viewpager,但回调方法(onPageScrolled和onPageScrollStateChanged)被多次调用,这导致向FragmentPagerAdapter添加了多个片段。所以请详细说明如何做到这一点。
答案 0 :(得分:9)
@dora:我认为在你的情况下FragmentStatePagerAdapter会帮助你。根据我的理解,我已经在下面提到了它的使用。我希望它能帮助你做出决定。
实施ViewPager有两种方法: •FragmentStatePagerAdapter •FragmentPagerAdapter
FragmentStatePagerAdapter 类消耗更少的内存,因为它会在用户看不到片段时销毁片段,只保留该片段的已保存状态
当片段数量较少时,FragmentPagerAdapter:。但是,对于大量碎片使用AndroidFragmentPagerAdapter会导致不稳定且滞后的用户体验。
viewPager持有的页数? 任何ViewPager将保留的项目数由setOffscreenPageLimit()方法设置。屏幕外页面限制的默认值为3.这意味着ViewPager将跟踪当前可见的页面,一个位于左侧,另一个位于右侧。被跟踪页面的数量始终以当前可见页面为中心。
请点击此链接获取代码:http://www.truiton.com/2013/05/android-fragmentpageradapter-example/
答案 1 :(得分:5)
我知道这篇文章很老了,但是我很难想出来,所以无论如何我都会回答它。
您想使用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();
}
}
这是片段:
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;
}
}
答案 2 :(得分:2)
我想在用户从右向左滑动时动态地向适配器添加一个新片段,并在用户从左向右滑动时删除动态删除片段。
AFAIK,任何PagerAdadpter
都不支持。它当然不会得到ArrayPagerAdapter
的支持。页面需要存在,否则您无法滑动到它。您不能先滑动,然后再添加页面。
此外,我从未找到过您的建议模式的用例,无法通过将页放在适配器中来处理,而不是填充页面(即,无论你看起来试图避免哪些昂贵的工作,直到刷卡开始。