为了使PagerAdapter
实现正常工作,应在定制适配器派生类中实现以下内容。
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
在我看来,这只是样板代码。
为什么要在派生类中这样做?是否有原因导致该代码不属于PagerAdapter
的一部分,并且派生类仅在(如果需要)时才使用其他内容覆盖它?那会是什么时候?
答案 0 :(得分:1)
我认为这是因为不能保证对象是视图。该文档甚至说了很多:
instantiateItem
返回一个代表新页面的对象。这不必是View,但可以是页面的其他容器。
如果object
参数不是视图,则destroyItem()
将失败并导致您的应用崩溃。
isViewFromObject()
不会崩溃,但始终返回false,这可能会导致数小时的尝试跟踪错误的麻烦。
即使它是一个View,并且您以其最基本的形式使用PagerAdapter,我也认为这些方法已被抽象化,因此1知道它们,2习惯于实现它们并知道如果您不使用视图作为对象,该怎么办。
您的View中可能有需要销毁的对象,例如BroadcastReceivers,回调等。虽然不需要销毁,但这是一个好习惯。