我有一个关于这个主题的问题,现在我的情况是我在scrollview里面有一个viewpager,这些内部的emilsjolander FlipView,结构看起来像:
@Component({
selector: 'navbar',
template: require('./navbar.html'),
styles: [style],
directives: [RouterLink, NgClass, NgIf],
providers: [UserService],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class Navbar implements OnInit {
isLoggedIn: boolean = false;
constructor(private location: Location, public userService: UserService) {}
isLocationEqual(loc:string):boolean {
return this.location.path() === loc;
}
ngOnInit(): void {
this.userService.isLoggedIn.subscribe((isLoggedIn: boolean) => {
console.log('RECEIVED!!', isLoggedIn);
this.isLoggedIn = isLoggedIn;
});
}
}
因为viewpager的某些问题无法检测到触摸,所以我只是实现了自定义Viewpager。
在我实现自定义Viewpager之后,触摸问题已修复,但是viewpager有关于动画的问题。
当我滑动viewpager时,有时候它工作得很完美,但有时候viewpager只是更改了没有动画的项目,而且似乎第二项更改为Sec Item必须导致这种情况。所以我只是将一些日志放入ScrollerCustomDuration类的startScroll方法中,我发现当viewpager没有动画时更改时,ScrollerCustomDuration的startScroll方法不会被调用。
很抱歉我的英语很差,感谢您的帮助,如果您需要我提供更多详细信息,请告诉我。
CustomViewPager类:
<FlipView>
<ScrollView>
<ViewPager>
</ViewPager>
</ScrollView>
</FlipView>
ScrollerCustomDuration类:
public class CustomViewPager extends ViewPager {
private ScrollerCustomDuration mScroller = null;
public CustomViewPager(Context context) {
super(context);
postInitViewPager();
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
postInitViewPager();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
Log.e("onInterceptTouchEvent",event.toString());
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
this.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
this.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return super.onInterceptTouchEvent(event);
}
private void postInitViewPager() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
Field interpolator = viewpager.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);
mScroller = new ScrollerCustomDuration(getContext(),
(Interpolator) interpolator.get(null));
scroller.set(this, mScroller);
} catch (Exception e) {
Log.e("MyPager", e.getMessage());
}
}
public void setScrollDurationFactor(double scrollFactor) {
mScroller.setScrollDurationFactor(scrollFactor);
}}
答案 0 :(得分:0)
以下代码解决了我的问题
fv.setOnFlipListener(new FlipView.OnFlipListener() {
@Override
public void onFlippedToPage(FlipView v, int position, long id) {
((BaseAdapter)fv.getAdapter()).notifyDataSetChanged();
}
});