课程名称:Android开发项目实战-领券联盟
在首页的顶部的类别栏时使用的ViewPager2,但是产生以下的错误,然后首页类别栏是空的。
打log发现是在第一次创建adapter之后(在BaseFragment里的onCreateView执行完之后),网络传输回类别之前。哪怕把后续的传输数据注释了也是会报这个错误
我也尝试了在adapter最开始也进行初始化,但是还是显示这个错误,类别栏也是空的,在adapter里打log输出类别也是正确的。
在homePager绑定adapter前后也打log看了绑定后是存在值的,说明是正确绑定了。
在绑定后也能通过getPageTitle输出类别,但是就是无法显示。
实在是不知道怎么回事了?

BaseFragment的onCreateView如下:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
homeBinding_ = FragmentHomeBinding.inflate(layoutInflater) // 类的成员变量
homePager_ = homeBinding_.homePager // 类的成员变量
tabLayout_ = homeBinding_.homeTabLayout
rootview_ = getRootView(inflater, container, savedInstanceState)
initPresenter()
loadData()
initView()
return rootview_
}
HomeFragment的initView如下
override fun initView() {
homePagerAdapter_ = HomePagerAdapter(this)
homePager_!!.adapter = homePagerAdapter_
if (tabLayout_ != null) {
TabLayoutMediator(tabLayout_!!, homePager_!!) { tab, position ->
tab.text = homePagerAdapter_!!.getPageTitle(position)
}.attach()
}
}
HomePageAdapter如下
class HomePagerAdapter(fragment: Fragment) :
FragmentStateAdapter(fragment) {
private val categoryList_: MutableList<Data> = mutableListOf()
init {
categoryList_.add(Data(0, "精选"))
}
public fun getPageTitle(position: Int): CharSequence {
return categoryList_[position].title
}
override fun getItemCount(): Int {
return categoryList_.size
}
override fun createFragment(position: Int): Fragment {
val homePagerFragment = HomePagerFragment()
return homePagerFragment
}
fun setCategories(categories: Categories) {
categoryList_.clear()
val data = categories.data
categoryList_.addAll(data)
notifyDataSetChanged()
}
}
解决了,是因为返回的是在BaseFrament里return的是rootView,但是我又用了viewBinding,虽然不知道为什么这两个指向的不是同一个东西,但是把BaseFragment里的返回设置成rootBinding.inflate(layoutinflater)就解决了。
提示:没有设置适配器
我看到你已经设置了:
那怎么还报这个错?要考虑一下时序之类的。
还需要你提供完整的日志。
这是在打断点看赋值的时候和报错后的homePager.Adapter的情况。
第一张图赋值的时候是和homePagerAdapter一样的,
第二张图报错后(在收到网络信息前)看Adapter的值也是有的。
图一和图二是两次运行的截图,所以@后面的哈希码不太一样。
这是我目前打的一个日志,不知道是否完整,如果需要补充我也可以输出,谢谢!