没有适配器连接到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)
    }
}

有人能帮我弄清楚我做错了什么吗? 预先谢谢你:)

解决方法

问题是您要混合两种扩大活动视图的方法,因此该视图没有得到适当的扩大。要解决您的问题,请替换:

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()

即使您保留数据绑定,您的应用程序也可以使用上面的代码,但是与binding相比,使用数据绑定和通过findViewById实例访问视图当然更方便。

,

我认为您没有在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()
}