kotlin
class MyFragmentPagerAdapter(
fm: FragmentManager,
private val fragments: List<Fragment>,
private val titles: List<String>
) : FragmentPagerAdapter(fm) {
override fun getCount(): Int {
return fragments.size
}
override fun isViewFromObject(view: View, `object`: Any): Boolean {
return view === `object`
}
override fun getItem(position: Int): Fragment {
return fragments[position]
}
override fun getPageTitle(position: Int): CharSequence? {
return titles[position]
}
}
- 在 Android 开发中,上述代码中,重写 isViewFromObject 方法后,ViewPager 不显示内容了
问题原因
- FragmentPagerAdapter 中的 isViewFromObject 方法实现如下,
java
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return ((Fragment)object).getView() == view;
}
-
这里返回的 object 实际上是一个 Fragment,而不是 View。而 isViewFromObject 方法的作用是判断 View 是否与 object 相关联
-
getItem 方法返回的 Fragment 对象,就会作为 isViewFromObject 方法中的 object 参数传入
-
View 和 Fragment 是两个完全不同的对象,
===永远返回 false,导致 ViewPager 认为当前显示的 View 与 Fragment 没有关联,从而不显示内容
处理策略
- 不重写 isViewFromObject 方法即可
kotlin
class MyFragmentPagerAdapter(
fm: FragmentManager,
private val fragments: List<Fragment>,
private val titles: List<String>
) : FragmentPagerAdapter(fm) {
override fun getCount(): Int {
return fragments.size
}
override fun getItem(position: Int): Fragment {
return fragments[position]
}
override fun getPageTitle(position: Int): CharSequence? {
return titles[position]
}
}