没有适配器连接到 viewpager2

No adapter attached to viewpager2

我一直在尝试在 kotlin 中实现 viewpager2,但我不明白为什么我会收到一条错误消息,提示没有适配器附加到回收视图 这是我的 MainActivity.kt:


class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.inflate(layoutInflater)
        binding.viewpager2.adapter = Viewpager2Adapter(this)
        TabLayoutMediator(binding.tabLayout , binding.viewpager2){
                tab, position ->
            tab.text = "OBJECT ${(position + 1)}"
        }.attach()
    }

}

下面是viewpager2Adapter.kt::


class Viewpager2Adapter(fa : FragmentActivity): FragmentStateAdapter(fa)  {
    override fun getItemCount(): Int = 3

    override fun createFragment(position: Int): Fragment= Fragment2()

}

这是我的 fragment2.kt::

class Fragment2 : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        return inflater.inflate(R.layout.fragment_2, container, false)
    }
}

有人可以帮我弄清楚我做错了什么吗? 提前谢谢你:)

问题是您混合了 2 种扩充 activity 视图的方法,因此视图未正确扩充。要解决您的问题,请替换:

setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)

binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)

你的代码应该可以工作。以上是实现数据绑定时应用的常规方法。如果您不使用数据绑定,代码将如下所示:

setContentView(R.layout.activity_main)
val viewpager2 = findViewById<ViewPager2>(R.id. viewpager2)
val tabLayout = findViewById<TabLayout>(R.id.tabLayout)
viewpager2.adapter = Viewpager2Adapter(this)
TabLayoutMediator(tabLayout , viewpager2){
    tab, position ->
    tab.text = "OBJECT ${(position + 1)}"
}.attach()

即使您保留数据绑定,您的应用程序也可以使用上述代码,但当然,与 findViewById 相比,通过 binding 实例使用数据绑定和访问视图要舒适得多。

我认为您没有在 MainActivity 中正确使用视图绑定。 在 setContentView 你应该有 binding.root 而不是 R.layout.activity_main

这是 MainActivity 中 onCreate 函数的代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)

    viewpager2Adapter = Viewpager2Adapter(this)
    viewPager2 = binding.viewpager2
    tabLayout = binding.tabLayout
    viewPager2.adapter = viewpager2Adapter


    TabLayoutMediator(tabLayout, viewPager2){
            tab, position ->
        tab.text = "OBJECT ${(position + 1)}"
    }.attach()
}