【问题标题】:setAdapter expects recycler view adapter but I want viewpager adapter. What am I doing wrong?setAdapter 需要回收器视图适配器,但我需要 viewpager 适配器。我究竟做错了什么?
【发布时间】:2020-12-27 13:42:23
【问题描述】:

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

目前我一直在尝试设置我的 viewpager。在开始之前,我将部分视图移动到片段,并使用下面链接到框架布局的代码成功地将片段加载到我的活动中。所以我的片段有效(结果 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()
        }
    }
}

在我的活动中将活动代码更改为

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

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

java.lang.IllegalStateException: FragmentManager 尚未连接到主机。

最终编辑

我修改了这个

val adapterviewpager = ViewPagerAdapter(FragmentActivity())

到这里:

val adapterViewPager = ViewPagerAdapter(this)

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

【问题讨论】:

  • 谁标记了我并且没有留下任何cmets?我遇到了问题,解释得很好,并在我解决问题的过程中包含了更新,这有什么问题?

标签: android android-fragments android-viewpager2


【解决方案1】:

使用FragmentStateAdapter 代替FragmentPagerAdapter

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

请阅读Migration Doc

【讨论】:

  • 感谢您的帮助。它帮助我更正了代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2021-11-15
  • 1970-01-01
  • 2017-06-14
  • 2016-08-10
  • 1970-01-01
相关资源
最近更新 更多