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。
我开始迁移到片段,想在它们之间滑动。我遵循了各种教程,卡住了,解开了,又卡住了(通常)。
目前我无法设置我的 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
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。