ViewPager + Fragment + RadioButton的使用

ViewPager + Fragment + RadioButton常见于首页。或者详情页的tab切换。出现频率非常之高。顾记录之。哪天忘了。就拿来看看。好记性不如烂笔头。

Adapter 创建

class MineAdapter(
    fm: FragmentManager,
) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
    
    
    
    override fun getCount(): Int {
    
    
        return 3 //此处返回的数量为页数总和(从1开始)
    }

    override fun getItem(position: Int): Fragment {
    
    
        return when (position) {
    
    
            TYPE_1 -> 1Fragment.newInstance()
            TYPE_2 -> 2Fragment.newInstance()
            TYPE_3 -> 3Fragment.newInstance()
            else -> throw IllegalArgumentException("无效参数 $position")
        }
    }

    override fun getItemPosition(any: Any): Int {
    
    
        return when (any) {
    
    
            is 1Fragment -> TYPE_1
            is 1Fragment -> TYPE_2
            is 1Fragment -> TYPE_3
            else -> super.getItemPosition(any)

        }
    }

    companion object {
    
    
        const val TYPE_1 = 0
        const val TYPE_2 = 1
        const val TYPE_3 = 2
    }
}

在activity中的使用

 binding.viewPager.adapter = adapter
 binding.viewPager.offscreenPageLimit = adapter.count

//如果需要viewPager和radioGroup联动。则需添加如下
val bottomTabs = arrayOf(R.id.tab1, R.id.tab2, R.id.tab3 )
binding.radioGroup.setOnCheckedChangeListener {
    
     _, i ->
            when (i) {
    
    
                bottomTabs[0] -> {
    
    
                    binding.viewPager.currentItem = TYPE_1
                }
                bottomTabs[1] -> {
    
    
                    binding.viewPager.currentItem = TYPE_2
                }
                bottomTabs[2] -> {
    
    
                    binding.viewPager.currentItem = TYPE_3
                }
            }
        }

// 给viewPager设置变化选中页时更新button的监听器
        binding.viewPager.addOnPageChangeListener(
            ViewPagerRadioGroupIndicatorListener(
                binding.rgTab
            )
        )

ViewPagerRadioGroupIndicatorListener如下:

/**
 * 用于当viewPager页面切换时更新radioButtons选中状态的监听器
 *FO
 * @author lxx
 */
class ViewPagerRadioGroupIndicatorListener(
    private val viewGroup: RadioGroup
) : ViewPager.OnPageChangeListener {
    
    

    override fun onPageScrollStateChanged(state: Int) {
    
    
        // noop
    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
    
    
        // noop
    }

    override fun onPageSelected(position: Int) {
    
    
        viewGroup.forEachIndexed {
    
     index, button ->
            if (button is RadioButton) {
    
    
                val bt = button as RadioButton
                bt.isChecked = index == position
            }
        }
    }
}

至此。全部结束。

猜你喜欢

转载自blog.csdn.net/lixinxiaos/article/details/128457070