首页 > 解决方案 > 如何在 kotlin 中实现 RecyclerViewPager?

问题描述

我正在尝试在我的项目中实现RecyclerViewPagerIndicator ,但我无法让它工作。

我使用 Kotlin 和 AndroidX

我希望从数据库中发送一个包含文本和图像的数组,并在RecyclerViewPager中显示,比如 tinder。

标签: androidkotlinandroidx

解决方案


我建议你使用dotsIndicator,因为它

  • 支持ViewPager 2基于RecyclerView
  • 被维护,你选择的不是(项目似乎被放弃了)
  • 写在Kotlin

例子:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager_2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <com.tbuonomo.viewpagerdotsindicator.WormDotsIndicator
        android:id="@+id/dots_indicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"/>

</LinearLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setupViewPager2()
    }

    private fun setupViewPager2() {
        val viewPager2 = findViewById<ViewPager2>(R.id.view_pager_2)
        val dotsIndicator = findViewById<WormDotsIndicator>(R.id.dots_indicator)

        viewPager2.adapter = PagerAdapter(this)
        dotsIndicator.setViewPager2(viewPager2)
    }
}

寻呼机适配器.kt

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

    override fun getItemCount(): Int = 3

    override fun createFragment(position: Int): Fragment {
        return when(position){
            0 -> SampleFragment.newInstance("One", "desc 1")
            1 -> SampleFragment.newInstance("Two", "desc 2")
            2 -> SampleFragment.newInstance("Three", "desc 3")
            else -> throw Exception("No such position")
        }
    }
}

片段样本.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".SampleFragment">
    <TextView
        android:id="@+id/txt_header"
        tools:text="Header 1"
        android:textAlignment="center"
        android:textSize="24sp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/txt_desc"
        tools:text="Desc 1"
        android:textAlignment="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

样本片段.kt

class SampleFragment : Fragment() {

    private var header: String? = null
    private var desc: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            header = it.getString(ARG_Header)
            desc = it.getString(ARG_Desc)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_sample, container, false)
        setView(view)
        return view
    }

    private fun setView(view:View){
        val headerText = view.findViewById<TextView>(R.id.txt_header)
        headerText.text = header
        val descText = view.findViewById<TextView>(R.id.txt_desc)
        descText.text = desc

    }

    companion object {

        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            SampleFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_Header, param1)
                    putString(ARG_Desc, param2)
                }
            }
    }
}

推荐阅读