之前面试的时候,被面试官问道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);
}
});
以上就是自己简单的一点记录, 如果有什么问题,评论区大家一起讨论。