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
}
}
}
}
至此。全部结束。