Проблема с объявлением адаптера Kotlin: несоответствие типа: предполагаемый тип — MyTabAdapter, но RecyclerView.Адаптер? ожидалось

#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:

Я вижу две проблемы:

  1. Статья , на которую вы ссылались , использовалась ViewPager , но фрагмент кода , который вы прикрепили , показал , что вы использовали ViewPager2 .
  2. 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