FragmentPagerAdapter在ViewPager中无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FragmentPagerAdapter在ViewPager中无法正常工作相关的知识,希望对你有一定的参考价值。

我正在使用FragmentPagerAdapter来调整viewPager中的片段。我编写代码并且它工作正常,这是我的代码

    public class SPStoryDetailsAdapter extends FragmentPagerAdapter {
    Context context;
    public ArrayList<SPStoryContents> storyContents;

    public SPStoryDetailsAdapter(ArrayList<SPStoryContents> storyContents, Context ctx, FragmentManager fm) {
        super(fm);
        context = ctx;
        this.storyContents = storyContents;
    }


    @Override
    public Fragment getItem(int position) {
        return SPStoryDetailsFragment.newInstance(storyContents.get(position));

    }

    @Override
    public int getCount() {
        return 2; // I just test it with two elements
    }

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

}

我这样称这个适配器。

   pagerAdapter = new SPStoryDetailsAdapter(storyContents, this, getSupportFragmentManager());
    pager = findViewById(R.id.viewPager);

    pager.setAdapter(pagerAdapter);
    pager.setPageTransformer(true, new SPSimpleTransformation());

    pager.post(() -> pager.setCurrentItem(currentPagerIndex,false));
    pageIndicatorView = findViewById(R.id.pageIndicatorView);
    pageIndicatorView.attachToPager(pager);
    pageIndicatorView.setVisibleDotCount(5);
    pageIndicatorView.setVisibility(storyContents.size() > 1 ? View.VISIBLE : View.GONE);

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

        }

        @Override
        public void onPageSelected(int position) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

这是我的孩子片段代码

public class SPStoryDetailsFragment extends Fragment {
private View view;

public static SPStoryDetailsFragment newInstance(SPStoryContents storyContents) {
    SPStoryDetailsFragment f = new SPStoryDetailsFragment();
    Bundle b = new Bundle();
    b.putSerializable("storyContent", storyContents);
    f.setArguments(b);
    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.sp_story_details_fragment, container, false);
    return view;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SPLogger.logMassage("viewVisibility", "mediaType");

}


@Override
public void onStop() {
    super.onStop();
    SPLogger.logMassage("liveEvent", "onStop");
    if (youTubePlayerView != null) {
        youTubePlayerView.pauseYoutubeVideo();
    }
}


@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (!isVisibleToUser && isResumed()) {

        SPLogger.logMassage("viewVisibility",
                youTubePlayerView == null ? "isNull" : "notNull2");
        SPLogger.logMassage("viewVisibility", "Call code when Fragment not visible");
        // Call code when Fragment not visible
    } else if (isVisibleToUser && isResumed()) {
        // Call code when Fragment becomes visible.
        SPLogger.logMassage("viewVisibility",
                youTubePlayerView == null ? "isNull" : "notNull");
        SPLogger.logMassage("viewVisibility", "Call code when Fragment becomes visible");

    }
    if (youTubePlayerView != null) {
        youTubePlayerView.pauseYoutubeVideo();
    }
    if (initializedYouTubePlayer != null)
        initializedYouTubePlayer.pause();

}

我试着解释我的问题。正如我所说viewpager工作正常,但是当viewPager启动时,两个子片段都已启动(在日志中,我可以显示viewVisibility两次)。当页面是当前页面时,是否以任何方式打印一次?

答案

ViewPageris为滑动功能做好准备。因此,他需要至少1个关闭屏幕页面才能为此做好准备。因此,解决方案是执行pager.setOffscreenPageLimit(0),但这是不可能的,最低页面限制大小为1.如果您需要在显示第二页之前在第一页上执行某些操作,请尝试其他方法。例如,从滑动锁定页面直到某些条件得到验证。

以上是关于FragmentPagerAdapter在ViewPager中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 ViewPager + FragmentPagerAdapter 处理方向更改

Android 在 FragmentPagerAdapter 中更改片段顺序

FragmentPagerAdapter 在调用 notifyDataSetChanged 后不会从 0 开始位置

如何在 FragmentPagerAdapter 中添加片段标签以便稍后引用片段?

FragmentPagerAdapter在ViewPager中无法正常工作

ViewPager中的FragmentPagerAdapter,FragmentStatePagerAdapter