TabLayout+ViewPager+Fragment(内部:TabLayout+ViewPager+ Fragment)需要注意!!

676 阅读2分钟

之前面试的时候,被面试官问道ViewPager嵌套ViewPager怎么处理的。我还一直在回答用最外层的vp的onInterceptTouchEvent来处理怎样怎样(注意是代码没有写过,就这样说了。。。)

现在写了下,自己记录一下注意的要点。

  • 第一种布局就是标题 TabLayout+ViewPager+Fragment(内部:TabLayout+ViewPager+ Fragment) ,就是某一个或多个 Fragment中 也有TabLayout+ViewPager+Fragment的布局。这里其实是没有滑动冲突的,但是如果代码写错了 ,就会有滑动冲突 ,然后还会崩溃的;我将注意的事项写出来,大家可以参考一下;
  • 注意adapter中的FragmentManager的获取!!以及Fragment在onDeath做收尾工作
//这里是Activity中的ViewPager的adapter , 注意这里是 getSupportFragmentManager(),
当然继承的Activity是AppCompatActivity

mViewPagerParent.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
    @Override
    public Fragment getItem(int i) {
        return mFragmentList.get(i);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    @android.support.annotation.Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mListName.get(position);
    }
});//下面的是Fragment中的ViewPager , Fragment是v4包下的,这里的是 getChildFragmentManager(),
之前直接写成getFragmentManager(),所以导致滑动冲突

mInnerViewPager.setAdapter(new FragmentPagerAdapter(getFragmentManager()) {
    @Override
    public Fragment getItem(int i) {
        return mInnerFragmentList.get(i);
    }

    @Override
    public int getCount() {
        return mInnerFragmentList.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mInnerListName.get(position);
    }
});
以及这个Fragment的onDeath中做收尾操作 , 这里可能是list持有Fragment的引用,导致没有被销毁,
然后下次再次进来的时候就可能会重复添加到list中
@Override
public void onDetach() {
    mInnerFragmentList.clear();
    super.onDetach();
}

  • 第二种就是使用Tablayout + ViewPager + view(某一个或多个view是ViewPager),这种的比较简单,直接正常的写代码就行,
  • 注意的地方只有一点,就是要给当前的view添加id
//这里的mListView中的某一个是ViewPager,就要给他添加一个id 

在创建ViewPager的时候设置一个id就可以了

ViewPager viewPager = new ViewPager(this);
viewPager.setId(123123);//这样设置可以运行,但是不规范。

mViewPagerParent.setAdapter(new PagerAdapter() {
    @Override
    public int getCount() {
        return mListView.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View view = mListView.get(position);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mListName.get(position);
    }
});



以上就是自己简单的一点记录, 如果有什么问题,评论区大家一起讨论。