#kotlin #android-recyclerview #adapter
#kotlin #android-recyclerview #адаптер
Вопрос:
Создание вкладок с помощью TabLayout и ViewPager2 и фрагмента. Я получаю несоответствие типов на адаптере. Я новичок в KOTLIN и Android, если есть какая-либо подходящая ссылка на учебник, которая имеет реализацию tablayout с viewpager2
class ProfileActivity:AppCompatActivity() {
lateinit var toolbar: Toolbar
lateinit var tabLayout: TabLayout
lateinit var viewpager2: ViewPager2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profile)
// Toolbar
toolbar=findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
supportActionBar?.apply {
title="Profile"
// show back button on toolbar
// on back button press, it will navigate to parent activity
// mentioned in AndroidManifest.xml
setDisplayHomeAsUpEnabled(true)
setDisplayShowHomeEnabled(true)
}
// Tab layout - add tab items
tabLayout=findViewById(R.id.profileTabLayout)
tabLayout.addTab(tabLayout.newTab().setText("Personal"))
tabLayout.addTab(tabLayout.newTab().setText("Education"))
tabLayout.addTab(tabLayout.newTab().setText("Interests"))
tabLayout.tabGravity=TabLayout.GRAVITY_FILL
//Viewpager2
viewpager2=findViewById(R.id.profileViewPager)
//Adapter for view pager
val adapter1=MyTabAdapter(this,supportFragmentManager,tabLayout.tabCount)
viewpager2.adapter= adapter1
viewpager2.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
tabLayout.addOnTabSelectedListener(
object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
viewpager2.currentItem = tab.position
}
override fun onTabUnselected(tab: TabLayout.Tab) {
}
override fun onTabReselected(tab: TabLayout.Tab) {
}
}
)
}
}
Вот код MyAdapter Вероятно, меня путают с FragmentStatePagerAdapter, поскольку он показывает устаревший, если есть какой-либо простой способ реализовать, я могу попробовать и это.
class MyTabAdapter(profileActivity: ProfileActivity, supportFragmentManager: FragmentManager, private var tabCount: Int) {
fun getItem(position: Int): Fragment? {
when (position) {
0 -> {
// val homeFragment: HomeFragment = HomeFragment()
// val personalFragment:PersonalFragment=PersonalFragment()
return PersonalFragment()
}
1 -> {
return EducationFragment()
}
2 -> {
// val movieFragment = MovieFragment()
return InterestsFragment()
}
else -> return null
}
}
fun getCount(): Int {
return tabCount
}
}
**Here is one of the fragment . I have three fragment in total.** I
class PersonalFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_personal, container, false)
}
}
I have referred the https://www.javatpoint.com/kotlin-android-tablayout-with-viewpager for implementation
Я
Комментарии:
1. Пожалуйста, приложите исходный код
MyTabAdapter
Ответ №1:
Я вижу две проблемы:
- Статья , на которую вы ссылались , использовалась
ViewPager
, но фрагмент кода , который вы прикрепили , показал , что вы использовалиViewPager2
. MyTabAdapter
ничего не расширяет, он должен расширять какой-то базовый адаптер.
В вашем случае, я полагаю, вы хотели использовать ViewPager2
для просмотра некоторых фрагментов. Вам нужно использовать FragmentStateAdapter
.
Измените MyTabAdapter
, чтобы вам понравилось это
class MyTabAdapter(profileActivity: ProfileActivity, private val tabCount: Int) : FragmentStateAdapter(profileActivity) {
override fun createFragment(position: Int): Fragment? {
when (position) {
0 -> {
// val homeFragment: HomeFragment = HomeFragment()
// val personalFragment:PersonalFragment=PersonalFragment()
return PersonalFragment()
}
1 -> {
return EducationFragment()
}
2 -> {
// val movieFragment = MovieFragment()
return InterestsFragment()
}
else -> return null
}
}
override fun getItemCount(): Int {
return tabCount
}
}
Проверьте здесь подробный документ о переходе с ViewPager
на ViewPager2