记录一个工作遇到的问题。PagerAdapter的显示问题

记录一个工作遇到的问题。PagerAdapter的显示问题

这个问题出现的的情况是在我们首页展示展示的情况。
在首页我们有一个fragments,其中第二个fragment中有一个viewpager。这个时候我们的首页有可能展示第一个,有可能展示第二个。然后我们会记录当前展示的页面的pageName,然后去进行页面埋点统计。 这个时候我们监听了Fragement的onResume和setUserVisibleHint的两个方法,来进行当前页面的统计。

image.png

我们在展示AFragment的时候,初始化了B,然后建了一个viewpage的适配器PageAdapter。
这个时候会发现 在第二个PagerAdapter,在初始化的时候绘制的过程中会强制调用setPrimaryItem的方法。
其中会有setUserVisibleHint(true),其实,这个时候B的所有Fragment是不可见的。因此就会有问题。

//PageAdapter的方法
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {    
Fragment fragment = (Fragment)object;   
  if (fragment != this.mCurrentPrimaryItem) {    
         if (this.mCurrentPrimaryItem != null) {            
                 this.mCurrentPrimaryItem.setMenuVisibility(false);        
                 this.mCurrentPrimaryItem.setUserVisibleHint(false);         
         }         
        fragment.setMenuVisibility(true);   
        fragment.setUserVisibleHint(true);    
        this.mCurrentPrimaryItem = fragment;    
     }
 }

修改的方法

@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    Fragment fragment = (Fragment) object;
    Fragment curPrimFragment = getCurrentPrimaryItem();
        if (fragment != curPrimFragment) {
            if (curPrimFragment != null) {
                curPrimFragment.setMenuVisibility(false);
                curPrimFragment.setUserVisibleHint(false);
            }
             if (parentFragment == null) {
                fragment.setMenuVisibility(true);
                fragment.setUserVisibleHint(true);
             } else {               
                fragment.setMenuVisibility(parentFragment.getUserVisibleHint());
                 fragment.setUserVisibleHint(parentFragment.getUserVisibleHint());
             }
            setCurrentPrimaryItem(fragment);
        }
}

@Nullable
protected Fragment getCurrentPrimaryItem() {
try {
        Field field = getClass().getSuperclass().getDeclaredField("mCurrentPrimaryItem");
        field.setAccessible(true);
        return (Fragment) field.get(this);
} catch (Throwable e) {
    return null;
}

protected void setCurrentPrimaryItem(Fragment fragment) {
    try {
        Field field =       getClass().getSuperclass().getDeclaredField("mCurrentPrimaryItem");
        field.setAccessible(true);
        field.set(this, fragment);
    } catch (Throwable e) {

    }
}



你可能感兴趣的:(记录一个工作遇到的问题。PagerAdapter的显示问题)