setAdapter 需要回收器视图适配器,但我想要 viewpager 适配器。我究竟做错了什么?

setAdapter expects recycler view adapter but I want viewpager adapter. What am I doing wrong?

我开始迁移到片段,想在它们之间滑动。我遵循了各种教程,卡住了,解开了,又卡住了(通常)。

目前我无法设置我的 viewpager。在开始之前,我将我的部分视图移动到一个片段,并使用下面链接到框架布局的代码成功地将片段加载到我的activity。所以我的片段有效(结果 1);

val fragment : WonGamesByDiff = WonGamesByDiff.newInstance()
        val ft: FragmentTransaction = supportFragmentManager.beginTransaction()
        ft.replace(R.id.fragment_container,fragment)
        ft.commit()

在我的框架布局下方,我添加了

<androidx.viewpager2.widget.ViewPager2
                    android:id="@+id/viewpager_fragments"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

我已经根据一些不同的教程创建了一个适配器,这些教程有不推荐使用的方法我已经知道了(我接受这可能是错误的,因为还不够远来测试它

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter

class viewpager_adapter(fragmentManager: FragmentManager):FragmentPagerAdapter(fragmentManager,FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {


    override fun getItem(position: Int): Fragment {
        return when(position){
            0 -> WonGamesByDiff.newInstance()
            1 -> WonGamesByDiff.newInstance()
            else -> WonGamesByDiff.newInstance()
        }
    }
    override fun getCount() = 2
}

这就是我到目前为止被困的地方。我收到一条错误消息,提示需要使用不同类型的适配器,但似乎无法在此处找到有相同问题的人

错误:类型不匹配。 必需的: (RecyclerView.Adapter?..RecyclerView.Adapter<*>?) 成立: viewpager_adapter

val vpager: ViewPager2
        vpager = findViewById(R.id.viewpager_fragments)
        val adapterviewpager = viewpager_adapter(supportFragmentManager)
        vpager.setAdapter(adapterviewpager);

我完全接受这个问题可能不是它告诉我的,如果它之前的设置不正确。

最终我想要实现的是滑动片段的能力,而不是我目前的方法,即在单个滚动视图中堆叠它们。

如果需要其他代码来评估这个请告知

编辑以下回复:

虽然我不是技术上的迁移(我已经设法按照不同的教程拼凑出 viewpager 和 viewpager2 的混合体),但我已经按如下方式更改了我的适配器;

package com.example.sumitup

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.viewpager2.adapter.FragmentStateAdapter

class ViewPagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {


    override fun getItemCount()=2

    override fun createFragment(position: Int): Fragment {
        return when(position){
            0 -> WonGamesByDiff.newInstance()
            1 -> WonGamesByDiff.newInstance()
            else -> WonGamesByDiff.newInstance()
        }
    }
}

并且在我的 activity 中将 activity 代码更改为

val vpager: ViewPager2
        vpager = findViewById(R.id.viewpager_fragments)
        val adapterviewpager = ViewPagerAdapter(FragmentActivity())
        vpager.adapter = adapterviewpager;

虽然这在编辑器(或构建)中不再出错,但我现在在 activity 加载时收到致命错误:

java.lang.IllegalStateException: FragmentManager 尚未附加到主机。

最终编辑

我修改了这个

val adapterviewpager = ViewPagerAdapter(FragmentActivity())

为此:

val adapterViewPager = ViewPagerAdapter(this)

纠正了我的致命错误,现在允许滑动片段

使用FragmentStateAdapter代替FragmentPagerAdapter

  • 当 ViewPager 使用 PagerAdapter 对视图进行分页时,请将 RecyclerView.Adapter 与 ViewPager2 一起使用。
  • 当 ViewPager 使用 FragmentPagerAdapter 通过少量固定数量的片段进行分页时,将 FragmentStateAdapter 与 ViewPager2 一起使用。
  • 当 ViewPager 使用 FragmentStatePagerAdapter 对大量或未知数量的片段进行分页时,将 FragmentStateAdapter 与 ViewPager2 一起使用

请阅读Migration Doc